Python转换CSV日期格式并计算日期间隔的技术求助
问题
我正在用Python处理一份已导入的CSV文件,文件包含开始日期和结束日期两列。需要将这两列日期转换为Python可识别的格式,以此计算两个日期之间的天数差。CSV中的日期格式示例如下:
Wednesday, 26-Jun-24 02:13:48 UTC
Thursday, 04-Jul-24 03:14:09 UTC (12.54 days ago)
这是从CSV文件中复制的精确格式。我曾尝试导入dateutil解析日期,但不确定具体用法,也不清楚这是否为最优方案,寻求技术指导。以下是我试过但未得到有效结果的代码:
from dateutil.parser import parse import datetime d = 'Monday, 10-Jun-24 17:16:47 UTC' dt = parse(d) print(dt.strftime('%m/%d/%y'))
解决方案
步骤1:清理日期字符串
部分日期末尾带有(12.54 days ago)这类冗余内容,需先去除这部分,只保留有效日期片段:
def clean_date_str(date_str): if '(' in date_str: return date_str.split('(')[0].strip() return date_str.strip()
步骤2:解析日期
有两种可靠实现方式:
方式一:使用dateutil.parser(灵活适配格式)
你的原代码本身可正常运行,失败原因大概率是未处理带括号的日期。结合清理函数后:
from dateutil.parser import parse d1 = 'Wednesday, 26-Jun-24 02:13:48 UTC' d2 = 'Thursday, 04-Jul-24 03:14:09 UTC (12.54 days ago)' # 先清理冗余内容 clean_d1 = clean_date_str(d1) clean_d2 = clean_date_str(d2) # 解析为datetime对象 dt1 = parse(clean_d1) dt2 = parse(clean_d2) print(dt1) # 输出:2024-06-26 02:13:48+00:00 print(dt2) # 输出:2024-07-04 03:14:09+00:00
方式二:使用datetime.strptime(性能更优,适合固定格式)
由于你的日期格式固定,可通过指定格式字符串解析,避免dateutil灵活解析的潜在风险:
格式参数说明:
%A:完整星期名称(如Wednesday)%d:两位日期(26)%b:缩写月份(Jun)%y:两位年份(24)%H:%M:%S:时分秒%Z:时区(UTC)
代码示例:
from datetime import datetime date_format = '%A, %d-%b-%y %H:%M:%S %Z' dt1 = datetime.strptime(clean_d1, date_format) dt2 = datetime.strptime(clean_d2, date_format)
步骤3:计算天数差
得到两个datetime对象后,直接相减即可获取时间差,再提取天数:
delta = dt2 - dt1 print(delta.days) # 输出:8 # 若需包含小时分钟的小数天数,可转换为总秒数计算 total_days = delta.total_seconds() / (24 * 3600) print(total_days) # 输出:8.042025462962963
处理CSV文件的完整流程
结合pandas(处理CSV的常用库)的完整实现:
import pandas as pd from datetime import datetime def clean_and_parse_date(date_str): clean_str = date_str.split('(')[0].strip() if '(' in date_str else date_str.strip() date_format = '%A, %d-%b-%y %H:%M:%S %Z' return datetime.strptime(clean_str, date_format) # 读取CSV文件 df = pd.read_csv('your_file.csv') # 转换日期列 df['开始日期'] = df['开始日期'].apply(clean_and_parse_date) df['结束日期'] = df['结束日期'].apply(clean_and_parse_date) # 计算天数差 df['天数差'] = (df['结束日期'] - df['开始日期']).dt.days # 计算包含小数的精确天数差 df['精确天数差'] = (df['结束日期'] - df['开始日期']).dt.total_seconds() / (24 * 3600) print(df.head())
内容的提问来源于stack exchange,提问作者Travis Ward
相关产品推荐
相关产品推荐

