Pandas如何将非连续日期列转换为对应日期的逐小时值
需求说明
- 存在非连续日期数据,读取为pandas DataFrame后需要转换为小时级粒度时间序列
- 要求仅保留每个指定日期当日00:00:00到23:00:00的24条小时记录,带US/Eastern时区
- 不需要填充不同日期之间间隔时段的小时数据
- 直接使用
resample('H').ffill()会生成首尾日期之间全部连续小时点,不符合预期
原有测试代码(存在问题)
d = {'date': ["1/1/2014", "5/26/2014", "7/4/2014"]} df = pd.DataFrame(data = d) df['date'] = pd.to_datetime(df['date']) df['date'] = df['date'].dt.tz_localize('US/Eastern') df = df.set_index('date') df = df.resample('H').ffill()
上述代码执行后会生成2014年1月1日至2014年7月4日之间共4416个连续小时的索引,不符合需求。
实现方案
全局重采样会默认补齐时间范围内所有连续时间点,因此改为逐日期生成当日小时序列再拼接即可:
import pandas as pd d = {'date': ["1/1/2014", "5/26/2014", "7/4/2014"]} df = pd.DataFrame(data = d) df['date'] = pd.to_datetime(df['date']).dt.tz_localize('US/Eastern') # 逐个生成每个日期对应的24个小时时间点 hour_index = [] for single_day in df['date']: # 生成单天0点到23点共24个带时区的小时时间点 day_hour_list = pd.date_range( start=single_day, periods=24, freq='H', tz='US/Eastern' ) hour_index.extend(day_hour_list) # 构建目标结果,如需ffill填充效果可执行以下逻辑 df = df.set_index('date') result = df.reindex(hour_index).ffill()
结果验证
最终生成的结果共72条记录(3天*24小时),索引顺序为:
- 2014-01-01 00:00:00-05:00 至 2014-01-01 23:00:00-05:00
- 直接跳转至2014-05-26 00:00:00-04:00 至 2014-05-26 23:00:00-04:00
- 直接跳转至2014-07-04 00:00:00-04:00 至 2014-07-04 23:00:00-04:00
不存在日期间隔时段的无效小时记录,符合预期。
内容的提问来源于stack exchange,提问作者ghw29
相关产品推荐
相关产品推荐

