如何修正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
相关产品推荐
相关产品推荐

