ゼロ以外のパディングされた時間と分を24時間制に変更

ゼロ以外のパディングされた時間と分を24時間制に変更

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=","}、または。

年間ロールオーバーを自分で処理できます。上記の内容を簡単に模倣することができますが、自分で努力すると役に立ちます。

おすすめ記事