基于年度常量数据补全小时级数据
这种批量填充年度值到小时级时间序列的需求太常见了,用嵌套if/switch确实会越写越崩溃,给你两个实用的高效方案,看你用哪种工具更顺手:
方案一:用Python Pandas处理
Pandas是处理这类时间序列数据的绝佳工具,完全不需要手动写年份判断逻辑,核心思路是生成时间序列后,通过年份关联自动匹配数值:
import pandas as pd # 1. 读取或创建输入年度数据 input_df = pd.DataFrame({ 'Year': [2018, 2019, 2020], 'Value': [100, 200, 300] }) # 2. 生成覆盖目标年份的小时级时间序列 # 按需调整起始/结束时间即可支持任意年份范围 start_dt = '2018-01-01 00:00:00' end_dt = '2020-12-31 23:00:00' hourly_times = pd.date_range(start=start_dt, end=end_dt, freq='H') output_df = pd.DataFrame({'Datetime': hourly_times}) # 3. 提取时间戳的年份,关联输入表的对应数值 output_df['Year'] = output_df['Datetime'].dt.year output_df = output_df.merge(input_df, on='Year', how='left').drop('Year', axis=1) # 4. 导出结果(可选) # output_df.to_csv('hourly_output.csv', index=False) print(output_df.head())
这个方法的优势是:不管你要处理30年还是更久的数据,只要调整start_dt和end_dt就行,完全不用修改匹配逻辑,而且Pandas的合并操作比手动判断高效N倍,大数据量下优势更明显。
方案二:用SQL处理(以MySQL 8.0+为例)
如果你的数据本身就在数据库里,用递归CTE生成时间序列,再通过年份关联即可,不用写一堆CASE WHEN:
-- 递归生成小时级时间序列 WITH RECURSIVE hourly_datetimes AS ( SELECT '2018-01-01 00:00:00' AS datetime_col UNION ALL SELECT DATE_ADD(datetime_col, INTERVAL 1 HOUR) FROM hourly_datetimes WHERE datetime_col < '2020-12-31 23:00:00' ) -- 关联年度表获取对应数值 SELECT hd.datetime_col AS Datetime, yv.Value FROM hourly_datetimes hd LEFT JOIN yearly_values yv ON YEAR(hd.datetime_col) = yv.Year ORDER BY hd.datetime_col;
如果是PostgreSQL等其他数据库,递归CTE的逻辑类似,只是生成时间的语法略有差异(比如用datetime_col + INTERVAL '1 hour'),核心都是通过YEAR()函数提取年份做关联,彻底告别手动判断每个年份的繁琐。
内容的提问来源于stack exchange,提问作者camerond12
相关产品推荐
相关产品推荐

