更高效的 HH:MM:SS 转换可能吗?

问题描述 投票:0回答:2

我想知道是否有更有效的方法将 gnuplot 纵坐标 (y) 轴的 HH:MM:SS 转换为十进制小时,日期为 (x) 横坐标。其中一些图有数千个数据点,需要很长时间才能将小时数转换为小数。

数据集 (/tmp/fn) 如下所示:

...
2022 Aug 21 05:35:16
2022 Aug 22 14:53:33
2022 Aug 31 14:11:55
2022 Sep 03 18:24:29
2022 Sep 03 18:24:56
2022 Sep 04 06:55:29
2022 Sep 04 06:55:44
2022 Sep 05 16:01:57
2022 Sep 05 16:02:16
2022 Sep 06 04:20:26
...

我当前的方法是 bash shell:

...
# change HH:MM:SS to "d"ecimal hours
for t in $(awk '{print $NF}' /tmp/fn)
do 
  read H M S < <(echo $t | sed 's|:| |g')
  d=$(echo "scale=4; $H + $M/60 + $S/3600" | bc 2>/dev/null)
  sed -i "s|$t|$d|g" /tmp/fn
done
...

[编辑]抱歉,我认为简单的 sed 构造表明了所需的输出:

...
2022 Aug 21 5.5877
2022 Aug 22 14.8924
...

[/编辑]

如果可以提高效率和减少耗时,那将非常有帮助,因为具有 9k 条目的数据文件转换大约需要 42 秒,并且可以使用更大的数据集。

Python 或 Perl 表达式也受到欢迎。谢谢您的考虑。

python bash perl time
2个回答
1
投票

我发布了

python
代码,因为有一个
python
标签,尽管提到了其他语言并且示例是在 bash 中。

您可以像这样转换为

epoch
时间:

from datetime import datetime

dates = [
    '2022 Aug 21 05:35:16',
    '2022 Aug 22 14:53:33',
    '2022 Aug 31 14:11:55', 
    '2022 Sep 03 18:24:29', 
    '2022 Sep 03 18:24:56',
    '2022 Sep 04 06:55:29',
    '2022 Sep 04 06:55:44',
    '2022 Sep 05 16:01:57',
    '2022 Sep 05 16:02:16',
    '2022 Sep 06 04:20:26'
    ]


for d in dates:
    datetime_obj = datetime.strptime(d, '%Y %b %d %H:%M:%S')
    epoch_time = datetime_obj.timestamp()  

    print(epoch_time)

给出了这个:

1661056516.0
1661176413.0
1661951515.0
1662225869.0
1662225896.0
1662270929.0
1662270944.0
1662390117.0
1662390136.0
1662434426.0

这样做的好处是它也使用日期部分!!


0
投票

使用

perl
单行:

$ perl -pe 's{(\d\d):(\d\d):(\d\d)$}{sprintf("%.4f", $1 + ($2/60.0) + ($3/3600.0))}e' fn.txt
2022 Aug 21 5.5878
2022 Aug 22 14.8925
2022 Aug 31 14.1986
2022 Sep 03 18.4081
2022 Sep 03 18.4156
2022 Sep 04 6.9247
2022 Sep 04 6.9289
2022 Sep 05 16.0325
2022 Sep 05 16.0378
2022 Sep 06 4.3406

如果您想直接修改文件并且这是所需的格式,请添加

-i
选项:
perl -pi -e ...

© www.soinside.com 2019 - 2024. All rights reserved.