熊猫按n秒分组,并应用任意滚动函数



我有一些加速度计读数的csv数据,格式如下(不完全是这样,实际数据的采样率更高):

2013-09-28 17:36:50.222120.152695-0.545074-0.8529972013-09-28 17:36:50622988、0.141800、-0.55947、-0.8679352013-09-28 17:36:51.923802、0.132431、-0.547089、-0.8793332013-09-28 17:36:52.21246410.124329-0.530243-0.8877412013-09-28 17:36:52.425341、0.122269、-0.519669、-0.9002692013-09-28 17:36:52.92620.122879-0502151-0.902023。。。。。。。。。。。。。。。。2013-09-28 17:49:14.440343、0.005447、-0.623016、-0.7735292013-09-28 17:49:14.557806、0.009048、-0.623093、-0.7909092013-09-28 17:49:14.758442、0.007217、-0.617386、-0.815796

我用熊猫加载它们

import pandas as pd
accDF=pd.read_csv(accFileName,header=0, sep=',') 
accDF.columns=['time','x','y','z']
accDF=accDF.set_index(['time'])

加速度计数据不是均匀采样的,我想每隔10、20或30秒对数据进行分组,并对数据组应用自定义函数。

如果数据是均匀采样的,那么应用滚动函数就很容易了。然而,由于不是,我想通过使用时间戳间隔来应用group。每隔一秒钟这样做很容易:

accDF_win=accDF.groupby(accDF.index.second).apply... etc

然而,我不知道如何按照任意的秒数进行分组,然后对其应用函数

有了TimeGrouper,我可以做以下事情:

accDF_win=accDF.groupby(pd.TimeGrouper(freq='3Min'))

持续任意分钟数,但TimeGrouper似乎没有"秒"分辨率。

提前感谢您的帮助

首先,您必须将datetime列转换为python datetime对象(如果没有)。

>>> import pandas as pd
>>> from dateutil import parser
>>> df=pd.read_csv("test.csv",header=None,date_parser=True)
#convert to datetime index, f.e. with dateutil
>>> df=df.set_index(df[0].map(parser.parse)

然后像这样使用pd.TimeGrouper

>>> df[3].groupby(pd.TimeGrouper('10S')).head()
2013-09-28 17:36:40  2013-09-28 17:36:40.322120   -0.852997
                     2013-09-28 17:36:41.622988   -0.867935
                     2013-09-28 17:36:42.923802   -0.879333
                     2013-09-28 17:36:43.124641   -0.887741
                     2013-09-28 17:36:45.425341   -0.900269
2013-09-28 17:36:50  2013-09-28 17:36:52.926202   -0.902023
                     2013-09-28 17:36:53.322120   -0.852997
                     2013-09-28 17:36:53.622988   -0.867935
                     2013-09-28 17:36:54.923802   -0.879333
                     2013-09-28 17:36:54.124641   -0.887741
2013-09-28 17:49:50  2013-09-28 17:49:56.440343   -0.773529
                     2013-09-28 17:49:56.557806   -0.790909
                     2013-09-28 17:49:57.758442   -0.815796

或者看看这里的重采样函数。也许您可以应用自定义的重采样函数,而不是使用groupby方法。

df[3].resample("10S",how=lambda x: Whateveryouwanttodo)

在没有任何功能的情况下,它充满了NaN:

>>> df[3].resample("10S")
0
2013-09-28 17:36:40   -0.877655
2013-09-28 17:36:50   -0.884617
2013-09-28 17:37:00         NaN
2013-09-28 17:37:10         NaN
2013-09-28 17:37:20         NaN
2013-09-28 17:37:30         NaN
2013-09-28 17:37:40         NaN

我认为您不需要TimeGrouper。支持按秒重新采样。你不是第一个尝试"S"几秒钟的人(也许熊猫应该支持它?);正确的字符串是's'。

df = pd.read_csv(filename, parse_dates=True, sep=',', index_col=0, header=None)
df.columns = ['x', 'y', 'z']
df.resample('10s', how=f)  # where f is your function

编辑:实际上,在我的版本(即将发布的0.13)上,我发现"10S"也能工作。也许你的全部问题不是解析日期。

最新更新