Pandas Dataframe对ms值进行重采样

时间:2017-12-02 19:42:19

标签: python pandas aggregate resampling

我有一个格式如下的文件:

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列表示我从系统测量的ms(从Java的System.nanoTime()转换而来)。因此,这些不代表任何日期/时间格式。我希望以5s的间隔聚合,例如从第一个6938987到6943987:得到SET / GET的值计数,得到平均值,标准偏差等。

我已尝试以各种方式使用data.resample,但继续获取 以下错误:

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'

有没有办法用值差而不是时间序列进行重新采样?

编辑 - JohnE建议的解决方案:

在timedelta中转换ms,然后重新采样到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  

可能是因为还有其他列必须还要对它们进行一些聚合吗?如果是这样,我怎么能多次这样做?

1 个答案:

答案 0 :(得分:1)

错误消息告诉您需要转换为类似日期时间的格式,因此您需要这样做!

一种相当简单的方法是转换为timedelta而不是timestamp,您可以按照以下步骤进行操作。首先,让我们使用更简单的数据版本:

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

然后创建一个新列“td”,表示以毫秒为单位的timedelta,“ms”。 (如果你想要微秒,请改用“我们”):

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

然后您可以轻松使用重新采样。请注意,您需要通过某些操作(例如,sum,max,mean等)来执行重新采样。在这里,我将与总和:

Animated.loop()