如何将numpy datetime64列转为带正确月度频率的pandas DatetimeIndex
解决方案
你的核心问题是混淆了月度频率的两种代码:M代表每月最后一天(月度结束),而你的数据是每月第一天(月度起始),对应的正确频率代码是MS。以下是几种可行的解决方法:
方法1:创建DatetimeIndex时指定正确频率
直接用MS作为频率参数创建索引,再替换原数据框的索引:
dt_idx = pd.DatetimeIndex(my_df['month_beginning'], freq='MS') my_df = my_df.set_index(dt_idx).drop(columns='month_beginning')
验证:执行后my_df.index.freq会显示<MonthBegin>,即正确的月度起始频率。
方法2:先设置索引再补全频率
先按常规方式设置索引,再手动指定或自动推断频率:
# 第一步:设置索引 my_df = my_df.set_index('month_beginning') # 方式2a:手动指定频率 my_df.index.freq = 'MS' # 方式2b:让pandas自动推断频率(适合数据无缺失的情况) my_df.index.freq = pd.infer_freq(my_df.index)
为什么第二次尝试报错?
你传入的freq='M'对应月度结束日期(如2016-01-31),但你的数据是月度起始日期(2016-01-01),pandas自动推断出的频率是MS,和你指定的M不匹配,因此抛出ValueError。
内容的提问来源于stack exchange,提问作者Max Power
相关产品推荐
相关产品推荐

