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

