You need to enable JavaScript to run this app. 如何将Python DataFrame中的日期单列拆分为多个指定年份区间?
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 01:36:02