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

如何修正Python销售数据的日期格式以适配pd.to_datetime解析?

修复异常日期格式并转换为datetime类型的Pythonic方案

问题场景

加载销售数据后,「Calendar Year/Month」列格式不符合pd.to_datetime的%m.%Y要求:

  • 月份部分存在1位数字(如8.202里的8),需要补前导0为08
  • 年份部分存在3位数字(如8.202里的202),实际应为2020,需要补末尾0到4位

列的唯一值示例:

8.202 ,  9.202 , 10.202 , 11.202 , 12.202 ,  1.2021,
2.2021, 3.2021,  4.2021,  5.2021,  6.2021,  7.2021,
8.2021,  9.2021, 10.2021, 11.2021, 12.2021,  1.2022,
2.2022,  3.2022,  4.2022, 5.2022,  6.2022,  7.2022

最Pythonic的实现方案

推荐两种高效写法,优先选择向量化字符串操作(避免循环,性能更优):

方案1:Pandas向量化字符串处理

import pandas as pd

# 确保列是字符串类型(如果原数据是数值,先转字符串)
sales['Calendar Year/Month'] = sales['Calendar Year/Month'].astype(str)

# 分割月份和年份
split_cols = sales['Calendar Year/Month'].str.split('.', expand=True)
month_col, year_col = split_cols[0], split_cols[1]

# 修复月份:补前导0到2位
fixed_month = month_col.str.zfill(2)
# 修复年份:3位则补末尾0到4位,否则保持原样
fixed_year = year_col.where(year_col.str.len() == 4, year_col.str.ljust(4, '0'))

# 合并为目标格式并转datetime
sales['formatted_date'] = fixed_month + '.' + fixed_year
sales['formatted_date'] = pd.to_datetime(sales['formatted_date'], format='%m.%Y')

方案2:正则表达式+apply(简洁易读)

如果需要更灵活的匹配逻辑,用正则分组处理:

import pandas as pd
import re

def fix_date(s):
    s_str = str(s).strip()
    # 匹配"数字.数字"的结构,捕获月份和年份
    pattern = re.compile(r'(\d+)\.(\d+)')
    match = pattern.match(s_str)
    if match:
        month = match.group(1).zfill(2)
        year = match.group(2).ljust(4, '0') if len(match.group(2)) == 3 else match.group(2)
        return f"{month}.{year}"
    return s_str

sales['formatted_date'] = sales['Calendar Year/Month'].apply(fix_date)
sales['formatted_date'] = pd.to_datetime(sales['formatted_date'], format='%m.%Y')

关键说明

  • str.zfill(2):自动给1位数字补前导0,2位数字保持不变
  • str.ljust(4, '0'):给3位年份补末尾0到4位,刚好把202转为2020
  • 向量化操作(方案1)比apply(方案2)性能更高,适合大数据量场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:03:20