使用Python中的时间序列数据来计算均值、方差和标准差。

3
我收集了来自传感器的数据,看起来像:
sec   nanosec value 

1001   1       0.2 

1001   2       0.2

1001   3       0.2 

1002   1       0.1  

1002   2       0.2   

1002   3       0.1 

1003   1       0.2 

1003   2       0.2

1003   3       0.1  

1004   1       0.2   

1004   2       0.2 

1004   3       0.2 

1004   4      0.1 

我想每2秒钟计算一次列的 平均数、标准差 以及其他统计数据,如最大值、最小值等。 例如,(1001, 1002) 的平均值=0.167,(1003,1004) 的平均值=0.17。

根据教程http://earthpy.org/pandas-basics.html,我认为我应该将它转换为时间序列,然后使用 pandas 中的 rolling_means 函数进行计算。但由于我不熟悉时间序列数据,所以我不确定这是否是正确的方法。 还有一个问题是,如何指定频率进行转换,因为第一秒钟的观察次数少于实际数据中的100个读数,之后才有100个观察值(从第1002秒开始)。

我也可以简单地对“秒”进行分组,但它会将每秒的读数分组而不是每2秒钟一组,那么如何结合两个连续的分组观察值进行分析呢?

2个回答

2
我认为您可以先将列sec通过to_timedelta进行转换,然后用set_indexresample2秒(2S)进行重采样:
df['sec'] = pd.to_timedelta(df.sec, unit='s')
df.set_index('sec', inplace=True)
print (df)
          nanosec  value
sec                     
00:16:41        1    0.2
00:16:41        2    0.2
00:16:41        3    0.2
00:16:42        1    0.1
00:16:42        2    0.2
00:16:42        3    0.1
00:16:43        1    0.2
00:16:43        2    0.2
00:16:43        3    0.1
00:16:44        1    0.2
00:16:44        2    0.2
00:16:44        3    0.2
00:16:44        4    0.1

print (df.value.resample('2S').mean())
sec
00:16:41    0.166667
00:16:43    0.171429
00:16:45         NaN
Freq: 2S, Name: value, dtype: float64

print (df.value.resample('2S').std())
sec
00:16:41    0.051640
00:16:43    0.048795
00:16:45         NaN
Freq: 2S, Name: value, dtype: float64

print (df.value.resample('2S').max())
sec
00:16:41    0.2
00:16:43    0.2
00:16:45    NaN
Freq: 2S, Name: value, dtype: float64

也许您需要更改resample中的base
print (df.value.resample('2S', base=1).mean())
sec
00:16:42    0.166667
00:16:44    0.171429
00:16:46         NaN
Freq: 2S, Name: value, dtype: float64

print (df.value.resample('2S', base=1).std())
sec
00:16:42    0.051640
00:16:44    0.048795
00:16:46         NaN
Freq: 2S, Name: value, dtype: float64

print (df.value.resample('2S', base=1).max())
sec
00:16:42    0.2
00:16:44    0.2
00:16:46    NaN
Freq: 2S, Name: value, dtype: float64

print (df.value.resample('2S', base=2).mean())
sec
00:16:43    0.166667
00:16:45    0.171429
00:16:47         NaN
Freq: 2S, Name: value, dtype: float64

print (df.value.resample('2S', base=2).std())
sec
00:16:43    0.051640
00:16:45    0.048795
00:16:47         NaN
Freq: 2S, Name: value, dtype: float64

print (df.value.resample('2S', base=2).max())
sec
00:16:43    0.2
00:16:45    0.2
00:16:47    NaN
Freq: 2S, Name: value, dtype: float64

我以为这个会起作用,但是我收到了一个警告,请尝试使用.loc[row_index,col_indexer] = value代替。df1['header_stamp_secs'] = pd.to_timedelta(df1.header_stamp_secs, unit='s')。然后出现了一个错误,只有在DatetimeIndex或PeriodIndex有效。 - AMisra
有趣。你使用的pandas版本是多少? - jezrael
我正在使用 pandas 0.13.1 - AMisra
嗯,最新版本是 0.18.1,我认为你可以升级 pandas - jezrael

1

借用jezrael的代码来设置:

df['sec'] = pd.to_timedelta(df.sec, unit='s')
df.set_index('sec', inplace=True)
print (df)
          nanosec  value
sec                     
00:16:41        1    0.2
00:16:41        2    0.2
00:16:41        3    0.2
00:16:42        1    0.1
00:16:42        2    0.2
00:16:42        3    0.1
00:16:43        1    0.2
00:16:43        2    0.2
00:16:43        3    0.1
00:16:44        1    0.2
00:16:44        2    0.2
00:16:44        3    0.2
00:16:44        4    0.1

使用 pd.TimeGrouper('2S')describe()
df.groupby(pd.TimeGrouper('2S')).describe()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接