如何用Pandas生成指定日期范围的多频率Datetime Series
如何扩展单日分时段频率的Pandas时间序列到跨年度范围?
我懂你已经搞定了单日的分频率时间序列生成,现在想把这个逻辑扩展到2015-12-01到2016-12-01的整段时间对吧?其实核心就是遍历目标日期范围内的每一天,动态给每个时段的pd.date_range加上当前日期,再把所有天的序列拼接起来就行。下面给你完整的实现方案:
实现思路
- 先生成目标范围内的所有日期(只保留日期部分,不带时间)
- 循环每个日期,为当天的三个时段分别生成时间序列
- 拼接当天的三个序列,存入临时列表
- 最后把所有天的序列一次性拼接,重置索引得到最终结果
完整代码
import pandas as pd # 定义时间范围的起始和结束日期(包含2016-12-01) start_date = pd.to_datetime("2015-12-01").date() end_date = pd.to_datetime("2016-12-01").date() # 生成需要处理的所有日期列表,freq='D'表示按天生成 date_list = pd.date_range(start=start_date, end=end_date, freq='D').date # 初始化空列表存储每天的时间序列(用列表存再批量拼接比循环里每次concat效率更高) daily_series_list = [] for current_date in date_list: # 把当前日期转为字符串,方便和时段时间拼接 date_str = str(current_date) # 按原逻辑生成当天三个时段的序列 # 01:00-07:00,1小时频率,共7个整点(01:00到07:00) part1 = pd.Series(pd.date_range(f"{date_str} 01:00:00", periods=7, freq="h")) # 07:30-21:30,30分钟频率,共29个时间点(到21:30结束,衔接后面的22:00) part2 = pd.Series(pd.date_range(f"{date_str} 07:30:00", periods=29, freq="30min")) # 22:00-次日00:00,1小时频率,共3个时间点(22:00、23:00、次日00:00) part3 = pd.Series(pd.date_range(f"{date_str} 22:00:00", periods=3, freq="h")) # 拼接当天的三个序列,加入列表 daily_series = pd.concat([part1, part2, part3]) daily_series_list.append(daily_series) # 拼接所有天的序列,得到最终结果 final_series = pd.concat(daily_series_list) # 重置索引,去掉原来的分段索引 final_series.reset_index(inplace=True, drop=True) # 查看结果的前后部分验证 print("前5条数据:") print(final_series.head()) print("\n后5条数据:") print(final_series.tail())
关键细节说明
- 用
pd.date_range(..., freq='D')生成日期列表时,会自动处理2016年是闰年的情况,不用额外调整 - 循环中使用f-string拼接日期和时间,动态生成每个时段的起始时间,完美复用你原来的单日逻辑
- 用列表存储每天的序列再最后一次性
concat,比循环中每次拼接效率高很多(尤其是处理一整年的数据时) - 保持了你原代码中的
periods参数,确保每个时段的时间点数量和覆盖范围完全一致
内容的提问来源于stack exchange,提问作者pars1221
相关产品推荐
相关产品推荐

