首页 > 解决方案 > 在 Pandas 中将每日多索引数据上采样为每小时样本

问题描述

我有一个看起来与此类似的数据框:

                     time       currency          rate
2021-02-22 00:00:00+00:00            USD  54410.856295
2021-02-23 00:00:00+00:00            USD  48691.894832
2021-02-24 00:00:00+00:00            USD  49849.378714
2021-02-25 00:00:00+00:00            USD  46992.665450
2021-02-26 00:00:00+00:00            USD  46551.487477
2021-02-22 00:00:00+00:00            EUR  50410.856295
2021-02-23 00:00:00+00:00            EUR  41691.894832
2021-02-24 00:00:00+00:00            EUR  40849.378714
2021-02-25 00:00:00+00:00            EUR  42992.665450
2021-02-26 00:00:00+00:00            EUR  42551.487477

我想做的是将每日数据上采样到每小时,所以我有按货币计算的每小时费率。我尝试了以下方法:

df.index = pd.DatetimeIndex(pd.to_datetime(df['time']))
df['time'] = df.resample('H').ffill()

但它失败了,因为“时间”列不是唯一的,所以我想我需要一个多索引来做到这一点。我已经尝试了几件事,但没有运气。

标签: pythonpandasdataframe

解决方案


尝试设置time为索引,然后groupby

(df.set_index('time').groupby('currency')
   .apply(lambda x: x.resample('H').ffill())
   .reset_index('currency', drop=True)
   .reset_index()
)

输出:

                         time currency          rate
0   2021-02-22 00:00:00+00:00      EUR  50410.856295
1   2021-02-22 01:00:00+00:00      EUR  50410.856295
2   2021-02-22 02:00:00+00:00      EUR  50410.856295
3   2021-02-22 03:00:00+00:00      EUR  50410.856295
4   2021-02-22 04:00:00+00:00      EUR  50410.856295
..                        ...      ...           ...
189 2021-02-25 20:00:00+00:00      USD  46992.665450
190 2021-02-25 21:00:00+00:00      USD  46992.665450
191 2021-02-25 22:00:00+00:00      USD  46992.665450
192 2021-02-25 23:00:00+00:00      USD  46992.665450
193 2021-02-26 00:00:00+00:00      USD  46551.487477

[194 rows x 3 columns]

推荐阅读