You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中提取跨多年多月份的固定日期间隔对应数据?

解决方案

错误原因

  • 首次尝试的pd.date_range写法问题:start日期晚于end日期,参数period应为periods,且固定30天的频率无法适配大小月、2月的天数差异,会出现区间偏移。
  • for循环报错原因:一是拼接的日期字符串在i=12时会出现14/13/2018这类无效月份,二是默认日期解析规则和拼接的字符串格式不完全匹配,三是仅覆盖了2018年的区间,没有处理2019、2020年的时间范围。

实现代码

import pandas as pd

# 1. 先将原始数据的日期列转为datetime格式,指定对应格式避免解析错误
df['Date'] = pd.to_datetime(df['Date'], format='%d-%m-%Y')

# 2. 生成所有区间的起始日期(2018年1月到2020年11月的每月15号)
start_dates = pd.date_range(start='2018-01-01', end='2020-11-01', freq='MS') + pd.Timedelta(days=14)
# 生成对应区间的结束日期(每个起始日加1个月再减1天,刚好是下个月14号)
end_dates = start_dates + pd.DateOffset(months=1) - pd.Timedelta(days=1)

# 可打印确认区间是否正确
for s, e in zip(start_dates, end_dates):
    print(f"区间:{s.strftime('%Y/%m/%d')} - {e.strftime('%Y/%m/%d')}")

# 3. 筛选所有落在目标区间内的数据
mask = pd.Series(False, index=df.index)
for s, e in zip(start_dates, end_dates):
    mask |= (df['Date'] >= s) & (df['Date'] <= e)
result_df = df[mask]

# 如果需要给数据标记所属区间方便后续分组统计,可以用以下代码
# df['period'] = None
# for s, e in zip(start_dates, end_dates):
#     period_label = f"{s.strftime('%Y%m')}_{e.strftime('%Y%m')}"
#     df.loc[(df['Date'] >= s) & (df['Date'] <= e), 'period'] = period_label
# result_df = df.dropna(subset=['period'])

内容的提问来源于stack exchange,提问作者Inequilazitive

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:15:03