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

Pandas如何将混合格式的时间差天数列转换为整数类型

问题说明

数据框df_jan的delta_sale列当前为object类型,列内混合存储了数值0、以及X days 00:00:00格式的时间差数据,需要将该列转换为仅保留天数值的整数类型。此前尝试pd.to_datetime()、df_jan['delta_sale'] / np.timedelta64(1, 'D')、直接.astype(int)等方法均未实现预期效果。

样例原始数据:

459984                   0
451375                   0
660585                   0
722735    78 days 00:00:00
448295                   0
                ...       
585781     4 days 00:00:00
612351    22 days 00:00:00
631985    16 days 00:00:00
462341                   0
450073                   0
Name: delta_sale, Length: 12978, dtype: object

预期转换效果:

459984                   0
451375                   0
660585                   0
722735                  78
448295                   0
                ...       
585781                   4
612351                  22
631985                  16
462341                   0
450073                   0
Name: delta_sale, Length: 12978, dtype: int

此前方法失效的核心原因是列内同时存在整数类型的0和字符串类型的时间差,类型不统一导致时间差转换函数报错。

可行方案

方案1:原生时间差转换(代码最简洁)

先将列内所有值统一转为字符串,再调用pandas的时间差转换函数处理,最后提取天数转为整数:

import pandas as pd

df_jan['delta_sale'] = pd.to_timedelta(df_jan['delta_sale'].astype(str)).dt.days.astype(int)
  • 逻辑说明:astype(str)会把原本的数值0转为字符串'0',pd.to_timedelta可以同时识别字符串格式的0、以及标准X days 00:00:00格式的时间差,转换为timedelta类型后通过.dt.days直接提取天级数值,最后转int即可匹配预期输出。

方案2:字符串正则提取(兼容性更强)

如果列内存在少量格式不标准的时间差值,可以直接通过正则提取天数部分,匹配不到的0值直接填充0后转整数:

df_jan['delta_sale'] = (
    df_jan['delta_sale'].astype(str)
    .str.extract(r'(\d+) days?')[0]
    .fillna(0)
    .astype(int)
)
  • 逻辑说明:正则(\d+) days?会匹配所有带days标识的片段并提取前面的数字,原本的0值转字符串后没有days字段,会返回空值,通过fillna(0)补全后转整数即可,对异常格式的容错性更高。

处理完成后可以通过df_jan['delta_sale'].head()抽样查看结果,通过df_jan['delta_sale'].dtype确认类型为int。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:51:23