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

如何将含大小写月份的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 08:37:45