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

Pandas处理零售数据分组后MONTH列月份显示错误问题求助

解决方案:从MONTH_ID纳秒后缀提取月份并映射名称

核心思路

你的MONTH_ID字段日期部分固定为1970-01-01,实际月份由**纳秒后缀的数字(1-12)**决定。之前的错误在于直接读取datetime的month属性(永远为1),或字符串截取逻辑错误导致无法正确提取月份编号。


方法1:字符串类型MONTH_ID处理

如果MONTH_ID是字符串格式,直接按小数点分割提取纳秒部分,转整数后映射月份名称:

import pandas as pd
import calendar

# 示例数据
df = pd.DataFrame({
    'MONTH_ID': [
        '1970-01-01 00:00:00.000000001',
        '1970-01-01 00:00:00.000000005',
        '1970-01-01 00:00:00.000000012'
    ]
})

# 提取纳秒部分转整数
df['MONTH_NUM'] = df['MONTH_ID'].str.split('.').str[1].astype(int)
# 映射月份名称(calendar.month_name索引1对应January,完美匹配1-12)
df['MONTH'] = df['MONTH_NUM'].map(lambda x: calendar.month_name[x])

输出结果:

MONTH_IDMONTH_NUMMONTH
1970-01-01 00:00:00.0000000011January
1970-01-01 00:00:00.0000000055May
1970-01-01 00:00:00.00000001212December

方法2:datetime类型MONTH_ID处理

如果MONTH_ID已经是datetime64[ns]类型,直接提取纳秒值:

# 先转换为datetime类型(如果还没转)
df['MONTH_ID'] = pd.to_datetime(df['MONTH_ID'])

# 提取纳秒值
df['MONTH_NUM'] = df['MONTH_ID'].dt.nanosecond
# 映射月份名称
df['MONTH'] = df['MONTH_NUM'].map(lambda x: calendar.month_name[x])

异常值处理

如果存在纳秒值不在1-12范围内的情况,可添加异常判断:

df['MONTH'] = df['MONTH_NUM'].apply(
    lambda x: calendar.month_name[x] if 1 <= x <= 12 else 'Unknown'
)

为什么之前的方法失败?

  • 直接取datetime的month属性:因为MONTH_ID的日期部分固定为1970-01-01,所以dt.month永远返回1,导致全为January。
  • 错误的字符串截取:比如用固定长度截取最后1-2位,会因为纳秒部分的前导零(如000000012)导致提取错误;用split('.')分割后取完整后缀转整数,能避免前导零干扰。
  • 列表映射索引错误:如果手动定义月份列表时从索引0开始,会导致1对应February、12对应January的错位;calendar.month_name从索引1开始对应January,完美匹配需求。

内容的提问来源于stack exchange,提问作者Migs Bautista

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:21:33