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
我有一个格式如下的文件:
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