Date

將非零填充小時和分鐘更改為 24 小時時間

  • December 29, 2014

在通過 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=","}.

您可以自己處理年度翻轉;您應該能夠輕鬆地在上面進行圖案化,但是自己努力會對您有好處。

引用自:https://unix.stackexchange.com/questions/176337