在通过 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'