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

如何用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)

原代码问题

  1. 没有区分不同单位的处理顺序,处理完月份后直接将所有值转为数值,导致后续无法识别周、年的原字符串
  2. 未覆盖Year和Days的转换逻辑
  3. 索引筛选操作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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:01:05