每小时重新采样数据帧

Posted

技术标签:

【中文标题】每小时重新采样数据帧【英文标题】:resample dataframe for every hour 【发布时间】:2018-08-26 22:43:13 【问题描述】:

我想通过将值替换为每小时的平均值来重新采样 Sms 、call 和 Internet 列中的数据。

代码 1 已尝试:

df1.reset_index().set_index('TIME').resample('1H').mean()

错误:仅对 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 有效,但获得了 'Index' 的实例

代码 2 已尝试:

df1['TIME'] = pd.to_datetime(data['TIME'])
df1.CALL.resample('60min', how='mean')

错误:仅对 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 有效,但获得了“RangeIndex”实例 数据框:

    ID          TIME         SMS          CALL      INTERNET
0   1   2013-11-30 23:00:00 0.277204    0.273629    13.674575
1   1   2013-11-30 23:10:00 0.341536    0.058176    13.330858
2   1   2013-11-30 23:20:00 0.379427    0.054601    11.329552
3   1   2013-11-30 23:30:00 0.600781    0.218489    13.166163
4   1   2013-11-30 23:40:00 0.405565    0.134176    13.347791
5   1   2013-11-30 23:50:00 0.187700    0.080738    12.434744
6   1   2013-12-01 00:00:00 0.282651    0.135964    13.860353
7   1   2013-12-01 00:10:00 0.109826    0.056388    12.583463
8   1   2013-12-01 00:20:00 0.348638    0.053438    12.644995
9   1   2013-12-01 00:30:00 0.138375    0.054062    12.251733
10  1   2013-12-01 00:40:00 0.054062    0.163803    11.292642


df1.dtypes
ID            int64
TIME         object
SMS         float64
CALL        float64
INTERNET    float64
dtype: object

【问题讨论】:

【参考方案1】:

你可以在resample中使用参数on

on:字符串,可选

对于 DataFrame,使用列而不是索引进行重采样。列必须类似于日期时间。 0.19.0 版中的新功能。

df1['TIME'] = pd.to_datetime(df1['TIME'])
df = df1.resample('60min', on='TIME').mean()
print (df)
                     ID       SMS      CALL   INTERNET
TIME                                                  
2013-11-30 23:00:00   1  0.365369  0.136635  12.880614
2013-12-01 00:00:00   1  0.186710  0.092731  12.526637

或者为DatetimeIndex添加set_index

df1['TIME'] = pd.to_datetime(df1['TIME'])
df = df1.set_index('TIME').resample('60min').mean()

【讨论】:

谢谢@jezrael。有用!!但在我的情况下,即使是 ID 列也被平均了。 ID SMS CALL INTERNET TIME 2013-11-30 23:00:00 5000.624339 2.829674 1.239895 62.598992 您可以使用df = df1.drop('ID', axis=1).resample('60min', on='TIME').mean()df = df1.drop('ID', axis=1).set_index('TIME').resample('60min').mean() @Shruti Bothe - 如果我的回答有帮助,请不要忘记 accept 它 - 单击答案旁边的复选标记 () 将其从灰色切换为已填充。谢谢。 我需要时间作为 df 列而不是索引。我还需要在 df 中出现 ID 列。

以上是关于每小时重新采样数据帧的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 将 5 分钟数据重新采样为每小时平均值:日期问题 [重复]

Pandas 将时间序列数据重新采样为 15 分钟和 45 分钟 - 使用多索引或列

将数据帧重新采样为具有任意期末月份的 n 个月期间

如何对具有多列的df重新采样

用最少的观察次数对 Pandas 重新采样

熊猫将每小时时间序列重新采样为每小时比例时间序列