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

