pandas 按 n 秒分组并应用任意滚动功能

6 python dataframe pandas

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

2013-09-28 17:36:50.322120, 0.152695, -0.545074, -0.852997
2013-09-28 17:36:50.622988, 0.141800, -0.554947, -0.867935
2013-09-28 17:36:51.923802、0.132431、-0.547089、-0.879333
2013-09-28 17:36:52.124641、0.124329、-0.530243、-0.887741
2013-09-28 17:36:52.425341, 0.122269, -0.519669, -0.900269
2013-09-28 17:36:52.926202, 0.122879, -0.502151, -0.902023
....
....
....
....
2013-09-28 17:49:14.440343, 0.005447, -0.623016, -0.773529
2013-09-28 17:49:14.557806, 0.009048, -0.623093, -0.790909
2013-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'])
Run Code Online (Sandbox Code Playgroud)

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

如果数据是均匀采样的,那么应用滚动函数就很容易了。但是,由于它不是,我想使用时间戳间隔来应用 groupby。以一秒的间隔执行此操作很容易:

accDF_win=accDF.groupby(accDF.index.second).apply... etc
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何按任意秒数进行分组,然后对其应用函数。

使用 TimeGrouper,我可以执行以下操作:

accDF_win=accDF.groupby(pd.TimeGrouper(freq='3Min'))
Run Code Online (Sandbox Code Playgroud)

任意分钟数,但似乎 TimeGrouper 没有“秒”分辨率。

在此先感谢您的帮助

dor*_*vak 4

首先,您必须将 datetime-column 转换为 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)
Run Code Online (Sandbox Code Playgroud)

然后像这样使用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
Run Code Online (Sandbox Code Playgroud)

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

df[3].resample("10S",how=lambda x: Whateveryouwanttodo)
Run Code Online (Sandbox Code Playgroud)

如果没有任何函数,它将用 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
Run Code Online (Sandbox Code Playgroud)