Python实现考虑闰年的时间序列DataFrame按年份分列转换
逐小时负荷序列转年度宽表实现方案
适用场景
针对已采集的2013-2020年逐小时系统负荷DataFrame(含date_time、system_load两列,共70128条记录),输出按年内相对采样位置对齐的年度宽表,自动适配闰年/平年的序列长度差,平年缺失位置自动填充NaN。
实现步骤(基于pandas)
代码依赖
- 确保pandas库已安装
- 原始DataFrame命名为
df
完整可运行代码
import pandas as pd # 解析日期时间列(若已为datetime类型可跳过) df['date_time'] = pd.to_datetime(df['date_time']) # 提取核心映射字段 df['year'] = df['date_time'].dt.year # 计算当年内的相对小时位置:从当年1月1日0点起累计计数,索引从0开始 df['relative_hour'] = (df['date_time'].dt.dayofyear - 1) * 24 + df['date_time'].dt.hour # 透视为目标宽表结构 wide_table = df.pivot( index='relative_hour', columns='year', values='system_load' ) # 按要求重命名列 wide_table.columns = [f'Year{col}' for col in wide_table.columns] # 重置索引,移除relative_hour索引列 wide_table = wide_table.reset_index(drop=True)
自动适配逻辑
- 闰年差异适配:
relative_hour完全基于自然时间偏移计算,闰年多出的2月29日采样点会自动落在对应累计位置,平年无对应日期,匹配时自动填充NaN,无需手动做长度对齐。 - 行索引自动对齐:最终宽表总行数为区间内最长年度的采样长度(即闰年的8784行),平年序列因长度不足8784,超出自身有效长度的位置全部填充NaN。
- 结果校验:生成的宽表共8列(Year2013至Year2020),其中平年列非空值为8760个,闰年(2016、2020)列非空值为8784个,总非空值和原始记录数完全一致。
内容的提问来源于stack exchange,提问作者swhh
相关产品推荐
相关产品推荐

