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

如何在Pandas中基于前序行值解析无年份日期并补全递减年份

解决Pandas中无年份日期按递减年份补全的问题

问题说明

需将DataFrame里cur_date列的无年份日期(格式如Jan-20 14:05)转换为YYYY-MM-DD %H:%M标准格式,且年份需按数据顺序递减——后一行年份不大于前一行,出现跨年时自动减年。

原始数据(cur_date列)

cur_date
Jan-20 14:05
Jan-4 05:07
Dec-31 12:07
Apr-12 20:54
Jan-21 06:12
Nov-3 04:10
Feb-5 11:45
Jan-7 07:09
Dec-3 12:11

期望结果(req_date列)

req_date
2023-01-20 14:05
2023-01-04 05:07
2022-12-31 12:07
2022-04-12 20:54
2022-01-21 06:12
2021-11-03 04:10
2021-02-05 11:45
2021-01-07 07:09
2020-12-03 12:11

之前尝试pd.to_datetime(df['cur_date'], format='%b-%d %H:%M')无法自动补全递减年份,用dateparser的PREFER_DATES_FROM='past'设置也无法基于前一行日期调整年份。

解决思路与代码

核心逻辑:先解析日期并指定初始年份,再通过相邻行日期对比判断是否需要减年,累计调整年份后得到最终结果。

import pandas as pd

# 构造示例数据
data = {
    'cur_date': [
        'Jan-20 14:05', 'Jan-4 05:07', 'Dec-31 12:07',
        'Apr-12 20:54', 'Jan-21 06:12', 'Nov-3 04:10',
        'Feb-5 11:45', 'Jan-7 07:09', 'Dec-3 12:11'
    ]
}
df = pd.DataFrame(data)

# 1. 解析日期,指定第一行的初始年份为2023
df['temp_date'] = pd.to_datetime(df['cur_date'], format='%b-%d %H:%M', year=2023)

# 2. 统计需要递减的年数:当前日期大于前一行时,标记为跨年需减年
df['year_adjust'] = (df['temp_date'] > df['temp_date'].shift(1)).cumsum()

# 3. 应用年份调整,生成最终日期
df['req_date'] = df['temp_date'] - pd.to_timedelta(df['year_adjust'], unit='Y')

# 4. 格式化为目标字符串格式(若需保留datetime类型可跳过此步)
df['req_date'] = df['req_date'].dt.strftime('%Y-%m-%d %H:%M')

# 查看结果
print(df[['cur_date', 'req_date']])

代码解释

  • 初始年份设置:通过year=2023指定第一行的基准年份,确保首行日期正确。
  • 跨年判断:(df['temp_date'] > df['temp_date'].shift(1)).cumsum()会累计统计当前行之前的跨年次数——每出现一次当前日期比前一行大的情况,就说明需要多减1年。
  • 年份调整:用pd.to_timedelta把累计的跨年次数转为时间差,从初始日期中扣除,得到符合递减要求的日期。

结果验证

运行代码后,req_date列将完全匹配期望的格式与年份递减规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:55:16