如何将csv列从12小时AM PM转换为24小时时间?[已关闭]

ivqmmu1c  于 2023-07-31  发布在  其他
关注(0)|答案(4)|浏览(114)

已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。

17天前关闭
Improve this question
我有一个来自导出的1900行csv列表,看起来像这样:

date,time,ampm
01/01/2024,3:43:19,pm
01/01/2024,3:43:19,am

字符串
我正在尝试循环一个if语句,它基本上说:

if [[ third csv entry  = pm ]]; then
    second csv entry numbers between , and : += 12
    print modified line
else
    print original line
fi


导致

date,time,ampm
01/01/2024,15:43:19,pm
01/01/2024,3:43:19,am


这看起来像是bash中的噩梦,但这是我所知道的最有效的使用方法。我对python的了解还不够,无法使用它。我也愿意接受其他建议。

ibrsph3r

ibrsph3r1#

这里有一种使用GNUsed的方法,在替换命令中使用e标志,该命令将模式空间作为shell命令执行。

sed '2,$ {
    y/,/ /
    s|.*|date -d "&" +%m/%d/%Y,%T,%P|e
}' infile

字符串
2,$是用来单独留下标题行的。
y/,/ /将所有逗号替换为空格。
替换命令将该行重新格式化为date命令,如下所示

date -d "01/01/2024 15:43:19 pm" +%m/%d/%Y,%T,%P


其中,-d参数现在采用date理解的格式,+...部分将输出格式化为所需的输出。
结果:

$ sed '2,${y/,/ /;s|.*|date -d "&" +%m/%d/%Y,%T,%P|e}' infile
date,time,ampm
01/01/2024,15:43:19,pm
01/01/2024,03:43:19,am

zpgglvta

zpgglvta2#

关于perl

perl -MTime::Piece -F, -lape '
    next if $. == 1;
    $t = Time::Piece->strptime($_, "%d/%m/%Y,%I:%M:%S,%p");
    $F[1] = $t->strftime("%-H:%M:%S");
    $_ = join ",", @F;
' file.csv

个字符
这避免了为每一行调用date
Time::Piece日期时间解析器很挑剔:输入字符串必须与预期的格式完全匹配,这就是我必须添加前导零的原因。
使用bash,我会写:

{
    IFS= read -r header
    echo "$header"
    while IFS= read -r line; do
        date -d "${line//,/ }" '+%D,%-H:%M:%S,%P'
    done
} < file.csv

xxe27gdn

xxe27gdn3#

添加一些示例以覆盖12:xx:xx am/pm

date,time,ampm
01/01/2024,3:43:19,pm
01/01/2024,3:43:19,am
01/01/2024,12:43:19,pm
01/01/2024,12:43:19,am

字符串
一个awk的想法:

awk '
BEGIN { FS=OFS="," }                                    # split 2nd field on ":" character; place subfields into array a[]
NR>1  { split($2,a,":")                                 # split 2nd field on ":" character; place subfields into array a[]
        offset = 0
        if ($3 == "pm" && a[1] != 12) offset =  12
        if ($3 == "am" && a[1] == 12) offset = -12

        $2 = a[1] + offset ":" a[2] ":" a[3]            # rebuild 2nd field
      }
1                                                       # print current line
' dt.csv


这产生:

date,time,ampm
01/01/2024,15:43:19,pm
01/01/2024,3:43:19,am
01/01/2024,12:43:19,pm
01/01/2024,0:43:19,am

ktecyv1j

ktecyv1j4#

这里有一个在bash中使用循环逐行阅读的方法

#!/bin/bash
input_file="input.csv"
output_file="output.csv"
    
while IFS=',' read -r date time ampm;do
        if [[ "${ampm,,}"=="pm" ]]; then
                convTime=$(date -d "$date $time" +"%H:%M:%S")
                echo "$date,$convTime,$ampm" >> "$output_file"
        else
                echo "$date,$time,$ampm" >> "$output_file"
        fi
     done < "$input_file"

字符串
结果如下

01/01/2024,15:43:19,pm 
01/01/2024,03:43:19,am

相关问题