如何将Python DataFrame中的日期单列拆分为多个指定年份区间?
Python DataFrame 按指定年度区间划分日期列实现方法
前置准备
假设你的DataFrame名称为df,需要划分的日期列名称为trans_date,所有操作基于pandas库完成,无需额外安装第三方工具。
第一步:转换日期列的标准格式
新手操作时最容易出错的点是:日期列以字符串格式存储,直接做时间范围判断会出现匹配错误,首先要把列转换为pandas可识别的标准时间类型:
import pandas as pd # 转换日期列,异常格式的内容自动转为空值,不中断程序运行 df['trans_date'] = pd.to_datetime(df['trans_date'], errors='coerce')
第二步:按指定区间完成标签划分
你需要划分的目标区间为2017-2018、2018-2019、2019-2020、2020-2021,以下提供两种新手易读的实现方案:
方案1:逐区间条件赋值(逻辑最直白,适合新手快速上手)
直接用pandas的行选择规则,为匹配每个区间的行打上对应标签,可灵活调整时间边界:
# 先给所有行设置默认标签,不匹配任何区间的内容会保留这个默认值 df['year_group'] = '未匹配区间' # 依次为每个区间匹配标签,注意边界用左闭右开规则避免重复匹配 # 2017-2018区间:匹配2017-01-01 到 2018-12-31 的全部日期 df.loc[(df['trans_date'] >= '2017-01-01') & (df['trans_date'] < '2019-01-01'), 'year_group'] = '2017-2018' # 2018-2019区间:匹配2018-01-01 到 2019-12-31 的全部日期 df.loc[(df['trans_date'] >= '2018-01-01') & (df['trans_date'] < '2020-01-01'), 'year_group'] = '2018-2019' # 2019-2020区间:匹配2019-01-01 到 2020-12-31 的全部日期 df.loc[(df['trans_date'] >= '2019-01-01') & (df['trans_date'] < '2021-01-01'), 'year_group'] = '2019-2020' # 2020-2021区间:匹配2020-01-01 到 2021-12-31 的全部日期 df.loc[(df['trans_date'] >= '2020-01-01') & (df['trans_date'] < '2022-01-01'), 'year_group'] = '2020-2021'
提示:如果你的业务规则中年度区间是跨月的(比如从当年9月到次年8月的学年区间),只需要把代码里的起止日期字符串替换为对应时间点即可,pandas会自动按时间大小比对,无需额外调整逻辑。
方案2:用分箱函数批量划分(代码更简洁,适合后续扩展更多区间)
当区间数量增多时,逐行写条件判断容易冗余,可直接用pandas内置的pd.cut()完成时间分箱,从根源上避免边界重复匹配的问题:
# 定义分箱的时间边界 bins = [ pd.Timestamp('2017-01-01'), pd.Timestamp('2019-01-01'), pd.Timestamp('2020-01-01'), pd.Timestamp('2021-01-01'), pd.Timestamp('2022-01-01') ] # 定义每个分箱对应的标签 labels = ['2017-2018', '2018-2019', '2019-2020', '2020-2021'] # 执行分箱,right=False表示区间为左闭右开,边界值不会被重复匹配 df['year_group'] = pd.cut( df['trans_date'], bins=bins, labels=labels, right=False, include_lowest=True )
第三步:校验划分结果
代码执行完成后,必须对结果做简单校验,避免逻辑偏差:
- 统计日期列转换后产生的空值数量,可通过
df['trans_date'].isna().sum()查看,确认没有因为格式转换丢失正常的日期值 - 按生成的分组列聚合,查看每个区间的时间范围和样本量:
df.groupby('year_group')['trans_date'].agg(['min', 'max', 'count'])
核对输出的每个区间的最小、最大日期,和你预期的边界完全一致后,就可以正常使用划分后的列做后续统计了。
内容的提问来源于stack exchange,提问作者sarahprakriti
相关产品推荐
相关产品推荐

