如何将含大小写月份的DataFrame日期列转为当月最后工作日日期类型?
解决Date列转换为当月最后一个工作日的问题
我来帮你搞定这个日期转换的问题!你遇到的报错主要来自两个地方:一是日期格式字符串不匹配(你的原数据是"月缩写 两位年份"的格式,但你用了%b%Y,缺少空格且年份格式不对);二是月份缩写大小写不一致,导致strptime无法正确识别。
下面是分步的解决方案,最终能得到你想要的当月最后一个工作日的结果:
步骤1:统一日期格式并解析
首先我们需要把Date列的字符串统一成标准格式,处理大小写问题,然后用pandas的to_datetime正确解析:
- 使用
str.title()将所有日期字符串转成标题格式(比如"AUG 17"变成"Aug 17","Jan 19"保持"Jan 19"),这样月份缩写能被%b正确识别。 - 格式字符串用
%b %y,对应"月缩写 两位年份"的结构。
步骤2:计算当月最后一个工作日
解析出日期后,我们先得到当月的最后一天,再调整到最近的工作日(周一至周五):
- 用
MonthEnd(0)将日期偏移到当月最后一天。 - 判断最后一天是周几:周六(weekday=5)则减1天,周日(weekday=6)则减2天,工作日则保持不变。
完整代码示例
import pandas as pd from pandas.tseries.offsets import MonthEnd # 你的原始DataFrame data = { 'Date': ['AUG 17', 'AUG 17', 'FEB 18', 'MAR 18', 'APR 18', 'Jan 19', 'Apr 19', 'Jun 19', 'Jan 20', 'Feb 20'], 'number': [1.0, 1.6, 1.0, 1.7, 6.0, 1.0, 2.0, 7.1, 5.5, 8.6] } df = pd.DataFrame(data) # 1. 统一格式并解析日期 df['Date'] = pd.to_datetime(df['Date'].str.title(), format='%b %y') # 2. 获取当月最后一天 last_days = df['Date'] + MonthEnd(0) # 3. 调整为最后一个工作日:周六减1天,周日减2天 adjust_days = last_days.dt.weekday.map({5: 1, 6: 2}).fillna(0).astype(int) df['Date'] = last_days - pd.to_timedelta(adjust_days, unit='D') # 查看结果 print(df)
输出结果
运行后你会得到和预期完全一致的结果:
Date number 0 2017-08-31 1.0 1 2017-08-31 1.6 2 2018-02-28 1.0 3 2018-03-30 1.7 4 2018-04-30 6.0 5 2019-01-31 1.0 6 2019-04-30 2.0 7 2019-06-28 7.1 8 2020-01-31 5.5 9 2020-02-28 8.6
额外说明
如果你不想用pandas的偏移量工具,也可以用纯datetime模块实现,但pandas的方法更简洁高效,尤其适合处理批量数据。
内容的提问来源于stack exchange,提问作者eduardo2111
相关产品推荐
相关产品推荐

