如何将CSV列中的12小时制(AM/PM)时间转换为24小时制?
解决方案:将12小时制CSV时间转换为24小时制
针对你的1900行CSV时间转换需求,这里提供三种实用方案,涵盖你熟悉的Bash、易上手的Python和高效的Awk工具:
1. Bash 实现方案
虽然你觉得Bash处理起来麻烦,但这个脚本逻辑清晰,能处理12pm/12am的边界情况,直接可用:
#!/bin/bash # 读取输入CSV,处理后写入输出文件 while IFS=, read -r date time ampm; do # 表头直接输出 if [[ "$date" == "date" ]]; then echo "$date,$time,$ampm" continue fi # 拆分时间的小时、分、秒 IFS=: read -r hour min sec <<< "$time" # 处理pm时段:12pm保持12,其他小时加12 if [[ "$ampm" == "pm" ]]; then [[ "$hour" -ne 12 ]] && hour=$((hour + 12)) else # 处理am时段:12am转为0 [[ "$hour" -eq 12 ]] && hour=0 fi # 格式化小时为两位数字(可选,若不需要可直接用$hour) formatted_hour=$(printf "%02d" "$hour") echo "$date,$formatted_hour:$min:$sec,$ampm" done < input.csv > output.csv
使用方法:将脚本保存为convert_time.sh,把你的CSV命名为input.csv放在同一目录,执行bash convert_time.sh,结果会生成在output.csv里。
2. Python 极简实现方案
即使你不熟悉Python,这个脚本注释清晰,复制就能用:
import csv # 打开输入和输出文件 with open('input.csv', 'r') as infile, open('output.csv', 'w', newline='') as outfile: reader = csv.reader(infile) writer = csv.writer(outfile) # 写入表头 writer.writerow(next(reader)) for row in reader: date, time_str, ampm = row # 拆分时间各部分 hour, minute, second = time_str.split(':') hour = int(hour) # 转换小时 if ampm == 'pm': hour = hour + 12 if hour != 12 else hour else: hour = 0 if hour == 12 else hour # 生成新时间并写入行 new_time = f"{hour:02d}:{minute}:{second}" writer.writerow([date, new_time, ampm])
使用方法:保存为convert_time.py,和input.csv放一起,执行python convert_time.py即可得到output.csv。
3. Awk 命令行快速方案
Awk处理文本效率极高,一行命令就能完成转换,适合大文件:
awk -F, ' BEGIN {OFS=","} NR==1 {print; next} { split($2, time_parts, ":") hour = time_parts[1] if ($3 == "pm") { hour = (hour != 12) ? hour + 12 : hour } else { hour = (hour == 12) ? 0 : hour } printf "%s,%02d:%s:%s,%s\n", $1, hour, time_parts[2], time_parts[3], $3 } ' input.csv > output.csv
使用方法:直接在终端运行这条命令,替换input.csv为你的文件名,结果会输出到output.csv。
内容的提问来源于stack exchange,提问作者parsecpython
相关产品推荐
相关产品推荐

