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

2024-10-01 11:38:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些加速度计读数的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

我用熊猫装的

^{pr2}$

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

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

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

但是,我不知道如何按任意秒数分组,然后对其应用函数。

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

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

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

提前谢谢你的帮助


Tags: csv数据函数index间隔格式时间win
2条回答

首先,您必须将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,如下所示:

^{pr2}$

或者看看重采样函数here。也许您可以应用一个自定义的重采样函数,而不是使用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

我觉得你不需要时间点器。支持秒重采样。你要在几秒钟内尝试'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”也可以工作。也许你的问题不在于分析日期。在

相关问题 更多 >