熊猫数据框重新取样的ms值
问题描述:
熊猫菜鸟在这里。熊猫数据框重新取样的ms值
我有以下格式的文件:
SET, 0, 0, 0, 6938987, 0, 4
SET, 1, 1, 6938997, 128, 0, 0
SET, 2, 4, 6938998, 145, 0, 2
SET, 0, 9, 6938998, 147, 0, 0
SET, 1, 11, 6938998, 149, 0, 0
....
SET, 1, 30, 6946103, 6, 0, 0
SET, 2, 30, 6946104, 6, 0, 2
GET, 0, 30, 6946104, 8, 0, 0
SET, 1, 30, 6946105, 8, 0, 0
GET, 2, 30, 6946106, 7, 0, 0
第5列表示,我从一个系统测量毫秒(从Java的System.nanoTime转换())。因此这些不代表任何日期/时间格式。我想要以5s为间隔进行聚合,例如从第一个6938987到6943987进行聚合:获取SET/GET的值计数,获取平均值,标准偏差等。
data = pd.read_csv('data2.log', sep=", ", header=None)
data.columns = ["command", "server", "lenQueue", "inQueue", "diffQueue", "diffParse", "diffProcess"]
r = data.resample("5ms", on='inQueue')
TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Int64Index'
任何方式做重采样与价值的差异,而不是一个时间序列:
我以不同的方式使用data.resample而是继续得到 以下错误试过吗? -
编辑由强尼建议的解决方案:
在timedelta转化毫秒,然后重新采样,以5ms的:
data['td'] = pd.to_timedelta(data['inQueue'], 'ms')
data['sum'] = data.set_index(data['td'])['lenQueue'].resample('5ms').sum()
[Other columns ommitted]
td sum
0 00:00:00 NaN
1 01:55:38.997000 NaN
2 01:55:38.998000 NaN
3 01:55:38.998000 NaN
4 01:55:38.998000 NaN
5 01:55:38.998000 NaN
6 01:55:38.999000 NaN
难道是因为有其他列是必须也有一些聚合完成他们?如果是这样,我该怎么做多次?
答
错误消息告诉你,你需要转换为类似日期时间的格式,所以你需要这样做!
一个相当简单的方法是转换为timedelta而不是时间戳,您可以按如下所示进行操作。首先,让我们使用您的数据的一个简化版本:
In [143]: df
Out[143]:
val ms
0 11 6938987
1 22 6938997
2 33 6938998
然后做一个新列“TD”表示以毫秒为单位,“MS”的timedelta。 (如果你想要微秒,用“us”代替):
In [144]: df['td'] = pd.to_timedelta(df['ms'],'ms')
In [145]: df
Out[145]:
val ms td
0 11 6938987 01:55:38.987000
1 22 6938997 01:55:38.997000
2 33 6938998 01:55:38.998000
然后你可以很容易地使用resample。请注意,您需要使用某些操作(例如总和,最大值,平均值等)重复采样。在这里,我将与总结:
In [146]: df.set_index(df['td'])['val'].resample('5ms').sum()
Out[146]:
td
01:55:38.987000 11.0
01:55:38.992000 NaN
01:55:38.997000 55.0
Freq: 5L, Name: val, dtype: float64
这很有道理,谢谢!我试图让它与我的数据集一起工作,但只获得NaN作为聚合结果。我已经更新了我原来的帖子,如果你可以请看看,并有任何建议 – dtam
@dtam可能只是频率?尝试一个更大的值,比如'5s'?南方人只是说在给定的时间间隔内没有值。 – JohnE
我试过更大的时间间隔,但有同样的问题。我回到你的例子,并尝试下面的行,有一个新的'总和'列的结果: df ['sum'] = df.set_index(df ['td'])['lenQueue']。resample ('5ms')。sum() 这也给我所有的NaNs。 – dtam