如何在Pandas DataFrame中基于年月列创建每月首日日期列?
解决方法:生成每月第一天的日期列
错误原因分析
你之前用calendar模块报错,是因为这些函数(比如itermonthdays3、monthrange)只能接收单个标量值(单个年份/月份整数),但你传入的是Pandas的Series(整个列的数据),所以触发了"Series布尔值模糊"的错误——Pandas无法对整个Series直接执行需要单个值的函数。
正确实现方案
不需要用循环或calendar模块,Pandas本身提供了更高效的矢量化方法来处理日期生成,以下是两种可靠方式:
方式1:直接拼接字符串转日期(推荐,性能最优)
先把月份缩写转成数字,再拼接成年份-月份-01的格式,最后转成日期并格式化:
import pandas as pd # 1. 转换月份缩写为数字(自动兼容大小写,比如jan/Feb都能识别) df1['Month'] = pd.to_datetime(df1['Month'], format='%b').dt.month # 2. 生成每月第一天的日期列,格式化为'日-月-年' df1['Month_Year'] = pd.to_datetime( df1['Year'].astype(str) + '-' + df1['Month'].astype(str) + '-01' ).dt.strftime('%d-%m-%Y')
方式2:用lambda + apply逐行处理(适合需要自定义逻辑的场景)
如果一定要用lambda函数,可以结合apply逐行调用datetime构造函数:
import pandas as pd from datetime import datetime # 先转换月份为数字 df1['Month'] = pd.to_datetime(df1['Month'], format='%b').dt.month # 使用lambda生成目标列 df1['Month_Year'] = df1.apply( lambda row: datetime(row['Year'], row['Month'], 1).strftime('%d-%m-%Y'), axis=1 )
验证结果
假设你的原始数据是:
| Month | Year |
|---|---|
| jan | 2020 |
| Feb | 2020 |
| mar | 2021 |
处理后Month_Year列会生成:
| Month_Year |
|---|
| 01-01-2020 |
| 01-02-2020 |
| 01-03-2021 |
内容的提问来源于stack exchange,提问作者Faisal Rizvi
相关产品推荐
相关产品推荐

