如何将含天数的时间字符串转小时格式?Python/UNIX工具实现
解决方案:将CSV中的“X days HH:MM:SS.ff”格式转换为总小时数格式
问题说明
原CSV中的时间字段采用“X days HH:MM:SS.ff”格式,datetime.strptime()无法直接匹配“X days”部分(无对应格式化指令),需要手动拆分计算:将天数转换为小时后与原小时数相加,得到总小时数:MM:SS.ff的格式。
Python 实现
通过字符串拆分提取天数和时间片段,计算总小时数后重新拼接:
import csv def convert_time(time_str): # 拆分天数与时间部分 days_part, time_segment = time_str.strip().split(' days ') total_hours = int(days_part) * 24 # 拆分小时与剩余时分秒 hour, rest = time_segment.split(':', 1) total_hours += int(hour) return f"{total_hours}:{rest}" # 处理本地CSV文件(替换为你的输入输出路径) with open('input.csv', 'r') as in_file, open('output.csv', 'w', newline='') as out_file: reader = csv.reader(in_file, delimiter=',') writer = csv.writer(out_file, delimiter=',') for row in reader: # 转换第3、4列的时间字段(索引从0开始) row[2] = convert_time(row[2]) row[3] = convert_time(row[3]) writer.writerow(row)
如果需要从标准输入读取、输出到标准输出,可修改为:
import csv import sys def convert_time(time_str): days_part, time_segment = time_str.strip().split(' days ') total_hours = int(days_part) * 24 hour, rest = time_segment.split(':', 1) total_hours += int(hour) return f"{total_hours}:{rest}" reader = csv.reader(sys.stdin, delimiter=',') writer = csv.writer(sys.stdout, delimiter=',') for row in reader: row[2] = convert_time(row[2]) row[3] = convert_time(row[3]) writer.writerow(row)
使用方式:python convert.py < input.csv > output.csv
UNIX 工具(Awk)实现
利用Awk的字符串拆分功能快速处理文本:
脚本文件方式
创建convert_time.awk:
BEGIN { FS = ", *" # 匹配逗号后任意数量的空格作为分隔符 OFS = ", " # 输出时用逗号加空格分隔字段 } { # 处理第3个字段 split($3, parts, " days ") split(parts[2], time_parts, ":") total_hour = parts[1] * 24 + time_parts[1] $3 = total_hour ":" time_parts[2] ":" time_parts[3] # 处理第4个字段 split($4, parts, " days ") split(parts[2], time_parts, ":") total_hour = parts[1] * 24 + time_parts[1] $4 = total_hour ":" time_parts[2] ":" time_parts[3] print $0 }
使用方式:awk -f convert_time.awk input.csv > output.csv
单行命令方式
awk 'BEGIN{FS=", *"; OFS=", "}{split($3,p," days "); split(p[2],t,":"); $3=p[1]*24+t[1]":"t[2]":"t[3]; split($4,p," days "); split(p[2],t,":"); $4=p[1]*24+t[1]":"t[2]":"t[3]; print $0}' input.csv > output.csv
内容的提问来源于stack exchange,提问作者Bashnoob
相关产品推荐
相关产品推荐

