将日度数据重采样为小时数据时最后日期失效问题求助
问题原因与解决方案
问题根源
pandas的resample默认采用左闭右开的时间区间规则:
- 对于
2024-01-01,resample生成的区间是[2024-01-01, 2024-01-02),覆盖当天0点到23点共24个小时 - 对于最后一个日期
2024-01-02,resample的区间是[2024-01-02, 2024-01-03),但原数据中没有2024-01-03的时间点,因此只会生成该日期的起始小时(即2024-01-02 00:00:00),不会自动扩展到当日23点,最终导致结果只有25行。
解决方案
方法1:临时添加下一天的时间点
通过给原数据追加最后一个日期的下一天0点的空行,让resample生成完整的最后一天小时数据,之后再删除多余的行:
import pandas as pd import numpy as np T1 = pd.Timestamp("2024-01-01") T2 = pd.Timestamp("2024-01-02") df = pd.DataFrame({"T" : [T1,T2], "V" : [1,2]}) # 添加最后一个日期的下一天0点的空行 last_date = df['T'].iloc[-1] + pd.Timedelta(days=1) df = pd.concat([df, pd.DataFrame({"T": [last_date], "V": [np.nan]})]) # 重采样填充并删除最后一行 df = (df .set_index("T") .resample("h") .ffill() .iloc[:-1]) print(df.shape) # 输出 (48, 1),符合预期
方法2:手动构建完整小时索引
直接生成从第一个日期到最后一个日期23点的所有小时索引,再通过reindex和ffill完成填充:
import pandas as pd T1 = pd.Timestamp("2024-01-01") T2 = pd.Timestamp("2024-01-02") df = pd.DataFrame({"T" : [T1,T2], "V" : [1,2]}) # 构建完整的小时时间序列 start = df['T'].iloc[0] end = df['T'].iloc[-1] + pd.Timedelta(hours=23) hourly_index = pd.date_range(start=start, end=end, freq='h') # 重索引并填充 df = (df .set_index("T") .reindex(hourly_index) .ffill()) print(df.shape) # 输出 (48, 1),符合预期
内容的提问来源于stack exchange,提问作者jacob
相关产品推荐
相关产品推荐

