
Pythonのpandasライブラリを介して実行する前にデータを変更する必要があります。
現在の保存形式は次のとおりです。真夜中の値は2400です。そうです。0000に変更。フォーマットは時間や分を埋めません。 2つのパラメータを次に変換する必要があると思います。必須ゼロパディング2400時間(0000-2359)滞在。
今簡単な部分があります!
難しい部分は2359から0000に変わるたびに日付も変更してみてください(「dayoftheyear」形式では、実際には仮定が簡単です。例:12月31日を除いて%j + 1)。
以下は、日付ロールオーバー時のデータ(最後の2つの列は日付ではなく値として保存されます)の例です(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に増加すると仮定しますが、これは明らかに望ましくありません。
それでは、年を1ずつ増やすために366にローリングを含めるように、同じ増分/形式をどのように拡張しますか?
私はこれを盲目的に試みます:
#!/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
...
スクリプトの最初の行は、次のコマンドを使用して、3番目のフィールドが「2400」であることを確認します。表現パターンそしてゼロ島デルタ適切に。 2番目はフィールドに4桁の数字を入力します。sprintf
。最後は、対応する行が印刷されることを保証します。
これをすべて1行に圧縮してawk
コマンドラインにスクリプトを提供するか{FS=OFS=","}
、または。
年間ロールオーバーを自分で処理できます。上記の内容を簡単に模倣することができますが、自分で努力すると役に立ちます。
答え2
それでは、3番目のフィールドが同じ場合は2400
それを変更し0000
、2番目のフィールドを1つ追加しますか?だからawk
これを試してみてください:
awk 'BEGIN{FS=OFS=","}$3==2400{$2++;$3="0000"}1'