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

