我有一些加速度计读数的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"也能工作。也许你的全部问题不是解析日期。