如何用Python Pandas将CSV中含年/月/周的时长列转换为天数?
使用Pandas将CSV中的时长字符串转换为天数
需求说明
需要把CSV文件Duration列中以年、月、周、天为单位的字符串,统一转换为以天为单位的目标格式。示例如下:
输入样本:
["7 Months","1 Year","8 Weeks","3 Days"]
预期输出:["210 Days","365 Days","56 Days","3 Days"]
原尝试代码
import pandas as pd df = pd.read_csv("master_list.csv", usecols = ['Duration']) #month manipulation starts df[df['Duration'].fillna('').str.contains('Months') & df['Duration'].fillna('').str.len().gt(0)] df["Duration"] = df["Duration"].str.replace("\sMonths", "") df['Duration'] = pd.to_numeric(df['Duration'], errors='coerce').fillna(0).astype(float) df['Duration'] *= 30.436875 #month manipulation end df[df['Duration'].fillna('').str.contains('Weeks') & df['Duration'].fillna('').str.len().gt(0)] df["Duration"] = df["Duration"].str.replace("\sWeeks", "") #df['Duration'] *= 30.436875 print(df)
原代码问题
- 没有区分不同单位的处理顺序,处理完月份后直接将所有值转为数值,导致后续无法识别周、年的原字符串
- 未覆盖
Year和Days的转换逻辑 - 索引筛选操作
df[df['Duration']...]未赋值,属于无效操作,不会修改原DataFrame
正确实现方案
通过提取数值+匹配单位的方式,分情况计算天数,最终格式化目标字符串:
import pandas as pd # 读取CSV,仅保留Duration列 df = pd.read_csv("master_list.csv", usecols=['Duration']) # 定义单位到天数的转换系数 unit_convert = { 'Year': 365, 'Months': 30.436875, 'Weeks': 7, 'Days': 1 } # 拆分数值和单位 df[['num', 'unit']] = df['Duration'].str.extract(r'(\d+)\s+(\w+)', expand=True) df['num'] = pd.to_numeric(df['num'], errors='coerce').fillna(0) # 计算天数并格式化结果 df['Duration'] = df.apply( lambda x: f"{round(x['num'] * unit_convert.get(x['unit'], 1))} Days" if pd.notna(x['unit']) else x['Duration'], axis=1 ) print(df)
代码说明
- 用正则
(\d+)\s+(\w+)拆分时长字符串中的数值和单位,存入新列 - 转换系数通过字典定义,后续可灵活添加新单位
- 逐行计算天数并拼接成目标格式,匹配失败时保留原数据
- 对异常值做了填充处理,避免运行报错
内容的提问来源于stack exchange,提问作者Mayuresh Deshmukh
相关产品推荐
相关产品推荐

