Pandas:重新采样分类索引数据
Pandas: resample categorical index data
假设一些测量数据(实际上每分钟给出一次)命名为logData
:
import pandas as pd, numpy as np
idxData = pd.to_datetime(['08:00', '08:15', '08:30', '08:45', '09:00'])
logData = pd.DataFrame(np.array([1.0, 2.0, 3.0, 4.0, 5.0]), columns=['val'], index=idxData)
idxRng = pd.interval_range(idxData[0], idxData[-1], freq='30min')
avgData = logData.groupby( pd.cut(logData.index, idxRng) ).mean()
数据分组为avgData
,例如看起来像这样:
val
(08:00:00, 08:30:00] 2.5
(08:30:00, 09:00:00] 4.5
这个下采样 avgData
现在应该(在执行一些其他计算之后)再次上采样,例如到 freq='10min'
的频率以进行进一步计算。由于 avgData.resample('10min')
抛出以下错误,问题是如何 重新采样分类数据 ?
TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'CategoricalIndex'
非常感谢!
为了使重采样起作用,您的索引需要具有 datetime64[ns] 数据类型
通过 运行 下面的代码检查索引的数据类型。
avgData.index.dtype
我花了一点时间才弄清楚如何有意义地转换分类索引,但 index.categories.mid
似乎可行,允许通过
重新采样数据
avgData.set_index( pd.DatetimeIndex( avgData.index.categories.mid ), inplace=True)
avgData = avgData.resample('5min').interpolate(method='nearest')
产生预期结果:
val
08:15:00 2.5
08:20:00 2.5
08:25:00 2.5
08:30:00 2.5
08:35:00 4.5
08:40:00 4.5
08:45:00 4.5
假设一些测量数据(实际上每分钟给出一次)命名为logData
:
import pandas as pd, numpy as np
idxData = pd.to_datetime(['08:00', '08:15', '08:30', '08:45', '09:00'])
logData = pd.DataFrame(np.array([1.0, 2.0, 3.0, 4.0, 5.0]), columns=['val'], index=idxData)
idxRng = pd.interval_range(idxData[0], idxData[-1], freq='30min')
avgData = logData.groupby( pd.cut(logData.index, idxRng) ).mean()
数据分组为avgData
,例如看起来像这样:
val
(08:00:00, 08:30:00] 2.5
(08:30:00, 09:00:00] 4.5
这个下采样 avgData
现在应该(在执行一些其他计算之后)再次上采样,例如到 freq='10min'
的频率以进行进一步计算。由于 avgData.resample('10min')
抛出以下错误,问题是如何 重新采样分类数据 ?
TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'CategoricalIndex'
非常感谢!
为了使重采样起作用,您的索引需要具有 datetime64[ns] 数据类型 通过 运行 下面的代码检查索引的数据类型。
avgData.index.dtype
我花了一点时间才弄清楚如何有意义地转换分类索引,但 index.categories.mid
似乎可行,允许通过
avgData.set_index( pd.DatetimeIndex( avgData.index.categories.mid ), inplace=True)
avgData = avgData.resample('5min').interpolate(method='nearest')
产生预期结果:
val
08:15:00 2.5
08:20:00 2.5
08:25:00 2.5
08:30:00 2.5
08:35:00 4.5
08:40:00 4.5
08:45:00 4.5