如何在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
相关产品推荐
相关产品推荐

