Pandas 1.0中如何从年份和月份生成日期型MonthIdx列
解决pandas中使用pd.to_timedelta处理年/月单位报错并生成月初日期的问题
这个问题我之前也碰到过!原因是pandas的pd.to_timedelta确实不再支持'M'(月)和'Y'(年)作为单位——毕竟不同月份天数不同,平年闰年的年长度也不一样,没法用一个统一的时间差来表示,所以官方就移除了这些单位的支持。
要生成你需要的MonthIdx列(即每个年-月的第一天),我们可以直接用pd.to_datetime来构造日期,这是更准确且高效的方式:
解决方案代码
import pandas as pd # 模拟你的DataFrame结构 df = pd.DataFrame( {'Year': [2020, 2021, 2022], 'Month': [4, 4, 4]}, index=[38, 65, 92] ) # 核心步骤:组合Year、Month和固定的Day=1,生成当月第一天的日期 df['MonthIdx'] = pd.to_datetime(df[['Year', 'Month']].assign(Day=1)) # 如果需要将日期格式转为YYYY/MM/DD的字符串形式,添加这一行 df['MonthIdx'] = df['MonthIdx'].dt.strftime('%Y/%m/%d')
输出结果
运行后你的DataFrame会变成:
Year Month MonthIdx 38 2020 4 2020/04/01 65 2021 4 2021/04/01 92 2022 4 2022/04/01
为什么原来的方法不行?
pd.to_timedelta设计用来处理固定时长的时间差(比如天、小时、分钟这些单位,长度是固定不变的),而月和年的时长是动态变化的,无法用一个统一的数值来表示,所以pandas在后续版本中移除了对'M'和'Y'单位的支持,避免产生歧义。
内容的提问来源于stack exchange,提问作者Zanam




