將非零填充小時和分鐘更改為 24 小時時間
在通過 python 中的 pandas 庫執行數據之前,我有需要更改的數據。
它目前採用將午夜值儲存為 2400的格式,應更改為 0000。該格式也不會填充小時或分鐘,我認為我需要這樣做才能將 2 個參數轉換為**所需的零填充 2400hr (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
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=","}
.您可以自己處理年度翻轉;您應該能夠輕鬆地在上面進行圖案化,但是自己努力會對您有好處。