如何在Pandas中将小时级数据重采样为半小时级并重复数值?
问题:将小时级DataFrame重采样为半小时级并重复原数值
我有一个名为prices的DataFrame,数据如下:
DateTime PriceAmountGBP 0 2022-03-27 23:00:00 202.807890 1 2022-03-28 00:00:00 197.724150 ... ... ... 23 2023-01-24 22:00:00 149.039322
我希望将prices从小时级数据重采样为半小时级,让PriceAmountGBP在对应半小时重复,期望输出如下:
DateTime PriceAmountGBP 0 2022-03-27 23:00:00 202.807890 1 2022-03-27 23:30:00 202.807890 ... ... ... 23 2023-01-24 20:00:00 168.227992
我尝试了以下代码,但结果不符合需求:
prices.set_index('DateTime').resample('30T').interpolate()
该代码输出的是插值后的数值,而非重复原小时数值,寻求正确的实现方法。
解决方案
你需要的是**向前填充(forward fill)**原小时的数值,而非插值计算新值,以下是几种可行的实现方式:
方法1:重采样后使用ffill()
# 设置DateTime为索引,重采样为30分钟频率,向前填充原数值 result = prices.set_index('DateTime').resample('30T').ffill()
resample('30T')会生成半小时间隔的时间索引,ffill()会将前一个存在的小时数值填充到新增的半小时行中,完全匹配你的需求。
方法2:使用asfreq()结合ffill()
如果原数据的时间索引是连续的小时级序列,也可以直接转换频率再填充:
prices.set_index('DateTime').asfreq('30T').ffill()
asfreq('30T')会生成半小时频率的索引,缺失的数值通过ffill()复用前一小时的数据。
方法3:手动生成索引并重新对齐
若需要更灵活的时间范围控制,可以手动创建半小时频率的索引后重新对齐数据:
import pandas as pd # 生成从原数据起始到结束的半小时频率索引 new_index = pd.date_range(start=prices['DateTime'].min(), end=prices['DateTime'].max(), freq='30T') # 设置原索引,重新索引后向前填充 result = prices.set_index('DateTime').reindex(new_index).ffill()
以上方法都会让原小时的PriceAmountGBP值重复到对应的半小时行中,与你期望的输出一致。
内容的提问来源于stack exchange,提问作者K.Best
相关产品推荐
相关产品推荐

