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

如何在pandas DataFrame中处理混合日期、缺失值并提取月份列

Pandas多文件日期处理问题解决方案

混合日期格式解析

同列存在多种日期格式时,不要直接省略format参数让pandas自动推断,很容易出现日月年解析错位。采用「优先解析主格式+失败值补解析」的逻辑即可:

# 优先按DD/MM/YYYY格式解析,解析失败的值标记为NaT(空日期值)
temp_df['Invoice Date'] = pd.to_datetime(
    temp_df['Invoice Date'], 
    format='%d/%m/%Y', 
    errors='coerce'
)
# 筛选出所有解析失败的行,按YYYY-MM-DD格式二次解析后回填
parse_fail_mask = temp_df['Invoice Date'].isna()
temp_df.loc[parse_fail_mask, 'Invoice Date'] = pd.to_datetime(
    temp_df.loc[parse_fail_mask, 'Invoice Date'],
    format='%Y-%m-%d',
    errors='coerce'
)

*注意:你提到的2022-03-17是横杠分隔,对应格式串为%Y-%m-%d,不要写成斜杠分隔的%Y/%m/%d,分隔符不匹配会导致解析失败。后续如果需要兼容更多日期格式,重复上述二次解析的逻辑即可。

仅填充缺失日期为当月1日

你之前的代码存在两个问题:一是isnull()返回的是逐行布尔值序列,不能直接作为单条件传入if判断;二是直接给整列赋值会覆盖所有非空值。正确写法只针对空值位置赋值:

# 先确保目标列是datetime类型
temp_df['Distributor Invoice Date'] = pd.to_datetime(
    temp_df['Distributor Invoice Date'],
    errors='coerce'
)
# 筛选空值位置,填充为当前月1日
na_mask = temp_df['Distributor Invoice Date'].isna()
temp_df.loc[na_mask, 'Distributor Invoice Date'] = pd.Timestamp.today().replace(day=1)

如果需要填充的是日期对应业务月的1日(而非当前自然月的1日),可以关联同表其他日期字段取月初,比如关联订单创建日期:

# 示例:按同表订单创建日期取月初填充
temp_df.loc[na_mask, 'Distributor Invoice Date'] = temp_df.loc[na_mask, 'Order Create Date'].dt.to_period('M').dt.to_timestamp()

新增月份列

基于datetime类型的日期列,用.dt访问器即可快速提取月份信息,根据业务需求选对应写法:

# 写法1:提取数字月份(3月返回整数3)
temp_df['Month'] = temp_df['Invoice Date'].dt.month

# 写法2:提取年-月格式字符串(返回"2022-03",适合分组统计)
temp_df['Month'] = temp_df['Invoice Date'].dt.strftime('%Y-%m')

# 写法3:生成月周期类型(适合做时间序列计算、环比统计)
temp_df['Month'] = temp_df['Invoice Date'].dt.to_period('M')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 21:45:47