Pandas 对 ms 值的数据帧重新采样

Pandas Dataframe resample on ms values

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

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() 转换而来)。因此,这些不代表任何 Date/Time 格式。我想以 5 秒为间隔进行聚合,例如从第一个 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  

可能是因为还有其他列必须也对它们进行了一些聚合?如果是这样,我该如何多次执行?

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

一个相当简单的方法是转换为 timedelta 而不是时间戳,您可以按如下方式进行。首先让我们使用一个更简单的数据版本:

In [143]: df
Out[143]: 
   val       ms       
0   11  6938987
1   22  6938997
2   33  6938998

然后创建一个新列 "td" 来表示以毫秒为单位的时间增量,"ms"。 (如果你想要微秒,请改用 "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