将非零填充的小时和分钟更改为 24 小时时间

将非零填充的小时和分钟更改为 24 小时时间

在通过 python 中的 pandas 库运行之前,我需要更改数据。

目前它的存储格式是午夜值为 2400那应该是改为0000。该格式也不会填充小时或分钟,我认为我需要这样做才能将 2 个参数转换为所需的零填充 2400 小时 (0000-2359)格式。

现在这是简单的部分!

困难的部分是,每次从 2359 滚动到 0000 时,它都应该也更改日期(采用“dayoftheyear”格式,这实际上让我更容易假设,即:%j +1,除了 12 月 31 日)。

所以这里是我的数据示例(最后两列是存储的非日期值)在一天的翻转(它是一个 csv 文件,但为了视觉清晰起见,我用一个空格来分隔它):

1,2014,361,2340,0,0
1,2014,361,2341,0,0
1,2014,361,2342,0,0
1,2014,361,2343,0,0
1,2014,361,2344,0,0
1,2014,361,2345,0,0
1,2014,361,2346,0,0
1,2014,361,2347,0,0
1,2014,361,2348,0,0
1,2014,361,2349,0,0
1,2014,361,2350,0,0
1,2014,361,2351,0,0
1,2014,361,2352,0,0
1,2014,361,2353,0,0
1,2014,361,2354,0,0
1,2014,361,2355,0,0
1,2014,361,2356,0,0
1,2014,361,2357,0,0
1,2014,361,2358,0,0
1,2014,361,2359,0,0
1,2014,361,2400,0,0
24,2014,361,2400,12.34
1,2014,365,2359,0,9
1,2014,365,2400,089.343,3
1,2015,1,1,234,456
1,2015,1,2,090,99
1,2015,365,2359,0,0
1,2015,365,2400,xx,xxx
1,2016,1,1,0,0
1,2016,1,2,0,0
1,2016,1,3,0,0

我假设解决方案是一堆嵌套在 for 循环中的 sed/awk,但我将把它留给代码忍者。提前致谢。

好的,这是同样的问题,但扩展到包括新年到来时的“如果”。所以我假设 $2 列将增加到 365 到 366,这显然是不可取的。

然后,我如何扩展相同的递增/格式以包括滚动到 366 以将年份递增 1?

我将盲目地尝试一下:

#!/bin/bash


filename="${1/.dat/_prepped.dat}"

awk '/^1/{print $0}' $1  |cut -d "," -f2,3,4,5,6 |

awk 'BEGIN{FS=OFS=","}
$3 == "2400" {$2 = $2 + 1; $3 = 0}
$2 == "366" {$1 = $1 + 1; $2 = 1}
{ $3 = sprintf("%04i", $3) }
1' >$filename

我尝试将所有内容集成到一个脚本中,将原始数据(例如:home.dat)输入到该脚本中,以便输出文件(例如:home_prepped.dat)。

上述数据通过上述脚本运行的结果:

2014,361,2340,0,0
2014,361,2341,0,0
2014,361,2342,0,0
2014,361,2343,0,0
2014,361,2344,0,0
2014,361,2345,0,0
2014,361,2346,0,0
2014,361,2347,0,0
2014,361,2348,0,0
2014,361,2349,0,0
2014,361,2350,0,0
2014,361,2351,0,0
2014,361,2352,0,0
2014,361,2353,0,0
2014,361,2354,0,0
2014,361,2355,0,0
2014,361,2356,0,0
2014,361,2357,0,0
2014,361,2358,0,0
2014,361,2359,0,0
2014,362,0000,0,0
2014,365,2359,0,9
2015,1,0000,089.343,3
2015,1,0001,234,456
2015,1,0002,090,99
2015,365,2359,0,0
2016,1,0000,xx,xxx
2016,1,0001,0,0
2016,1,0002,0,0
2016,1,0003,0,0

答案1

awk所有这一切都是由它自己完成的。sprintf剩下的工作由格式化、普通模式和分配完成。

$3 == "2400" {$2 = $2 + 1; $3 = 0}
{ $3 = sprintf("%04i", $3) }
1

如果您将其放入dates.awk然后通过以下方式运行示例数据:

$ awk -F, -vOFS=, -f dates.awk < data

那么你会得到:

...
2014,344,2359,0,0
2014,345,0000,0,0
2014,345,0001,0,0
...

脚本的第一行使用以下命令检查第三个字段是否为“2400”表达模式零和增量适当地。第二个将字段填充为四位数字sprintf。最后一个确保打印该行。

您可以将它们全部压缩到一行中以awk在命令行上提供脚本,还可以通过在前面添加{FS=OFS=","}.

您可以自行处理年度结转;你应该能够轻松地模仿上面的内容,但自己付出努力会对你有好处。

答案2

那么,如果第三个字段等于2400您想将其更改为0000并将第二个字段加一?那么尝试awk一下:

awk 'BEGIN{FS=OFS=","}$3==2400{$2++;$3="0000"}1'

相关内容