背景情報 (下部の質問を参照): 過去 10 年間、さまざまなタイム ゾーンの数百のサイトで毎時間、機器によって収集された 1 時間ごとの平均観測値のデータセットを受け取りました。計測器は夏時間に合わせて調整されることはないため、データセット内のすべての時間は現地の標準時間です。1 時間ごとに報告される値は、前の 1 時間に毎分行われた測定値の平均です。年、月、日、および時間が別々の列で報告されます。時間は 0:23 ではなく 1:24 から始まります。UTC 日時を含む新しい列を作成したいと考えています。
以下のデータ テーブルは、最新のソリューションを使用したサンプル データセットです。2 週間の多くのイライラする時間の間、私は strptime、chron、POXITcl、および POXITlt を試し、stackoverflow やその他のソースを精査して、解決策が何であるかを理解しようとしました。変換を試みているときに何が起こっているのかはわかりません (ほとんどの場合、それが間違っていると確信している場合を除きます!)。
私が作成した日時列が、私が使用すべき正しい中間ステップであるかどうか、またはそれからRが正しく処理するUTC時間に取得する方法かどうかはわかりません。日時列のデータと時刻の間に文字「T」を挿入して、列を強制的に文字のままにしました。そうしないと、予期しないことが起こります。たとえば、私のコンピュータのオペレーティング システムのタイムゾーンは America/Toronto で、
as.POSIXct(mydata$datetime, format="%Y-%m-%dT%H:%M %z")
2013-01-01T01:00-0800 を 2013-01-01 04:00:00 に変換します。上記のコマンドは、UTC ではなく、マシンのタイムゾーンに変換しているようです。したがって、コマンドを実行する前に、コンピューターのオペレーティング システムのタイム ゾーンを変更せずに、R 環境のタイム ゾーンを変更すると、
Sys.setenv(TZ = "GMT")
mydata$dateUTC <- as.POSIXct(mydata $datetime, format="%Y-%m-%dT%H:%M %z")
Sys.unsetenv("TZ")
次に、上記のコマンドは2013-01-01T01:00-0800 を 2013-01-01 09:00:00 に変換します。これは、探している UTC 時間のようです。
hour24 についてはあまり心配していません。どの方法を使用しても、日付は自動的に翌日に繰り上げられ、時間は 00:00 に変更されるようです (たとえば、2013-01-01 24:00 は 2013-01 になります)。 -02 00:00)。
UTC から現地時間に変換するとき、標準時から夏時間に変わる日付が何年にもわたって変更されている可能性があるという事実について、私はあまり心配していません。正しい UTC 時間と Olson タイムゾーンが与えられた場合、IANA タイムゾーン データベースを使用すると、これは自動的に処理されるはずです (私はそう思います)。
質問 1: R を使用して、1 年を通して現地標準時で報告されている年月日時間を UTC 時間に変換するにはどうすればよいですか?
質問 2: R を使用して、UTC 時間からローカル標準時間に変換するにはどうすればよいですか (常用時に DST を使用する地域では DST に変換せずに)?
質問 3: R を使用して、夏時間を考慮して UTC 時刻から現地時刻に変換するにはどうすればよいですか?
質問 4: UTC から現地時間に変換するには、IANA データベースのタイムゾーン名が必要です。各サイトの緯度と経度を考慮して、Web 上のどこかからこれを取り込む方法はありますか?
filename = mydata
site year month day hourend UTCoffset datetime obs
2001 2015 1 1 22:00 -0200 2013-01-01T22:00-0200 1356
2001 2015 1 1 23:00 -0200 2013-01-01T23:00-0300 1593
2001 2015 1 1 24:00 -0200 2013-01-01T24:00-0200 946
2001 2015 1 2 01:00 -0200 2013-01-02T01:00-0200 271
2001 2015 1 2 02:00 -0200 2013-01-02T02:00-0200 665
3001 2015 1 1 22:00 -0350 2013-01-01T22:00-0350 548
3001 2015 1 1 23:00 -0350 2013-01-01T23:00-0350 936
3001 2015 1 1 24:00 -0350 2013-01-01T24:00-0350 1938
3001 2015 1 2 01:00 -0350 2013-01-02T01:00-0350 952
3001 2015 1 2 02:00 -0350 2013-01-02T02:00-0350 1584
4001 2015 1 1 22:00 -0400 2013-01-01T22:00-0400 1837
4001 2015 1 1 23:00 -0400 2013-01-01T23:00-0400 1275
4001 2015 1 1 24:00 -0400 2013-01-01T24:00-0400 382
4001 2015 1 2 01:00 -0400 2013-01-02T01:00-0400 837
4001 2015 1 2 02:00 -0400 2013-01-02T02:00-0400 592
5001 2015 1 1 22:00 -0500 2013-01-01T22:00-0500 392
5001 2015 1 1 23:00 -0500 2013-01-01T23:00-0500 15
5001 2015 1 1 24:00 -0500 2013-01-01T24:00-0500 403
5001 2015 1 2 01:00 -0500 2013-01-02T01:00-0500 993
5001 2015 1 2 02:00 -0500 2013-01-02T02:00-0500 1287
6001 2015 1 1 22:00 -0600 2013-01-01T22:00-0600 738
6001 2015 1 1 23:00 -0600 2013-01-01T23:00-0600 992
6001 2015 1 1 24:00 -0600 2013-01-01T24:00-0600 1392
6001 2015 1 2 01:00 -0600 2013-01-02T01:00-0600 189
6001 2015 1 2 02:00 -0600 2013-01-02T02:00-0600 1282
7001 2015 1 1 22:00 -0700 2013-01-01T22:00-0700 839
7001 2015 1 1 23:00 -0700 2013-01-01T23:00-0700 742
7001 2015 1 1 24:00 -0700 2013-01-01T24:00-0700 942
7001 2015 1 2 01:00 -0700 2013-01-02T01:00-0700 882
7001 2015 1 2 02:00 -0700 2013-01-02T02:00-0700 993
8001 2015 1 1 22:00 -0800 2013-01-01T22:00-0800 1140
8001 2015 1 1 23:00 -0800 2013-01-01T23:00-0800 1532
8001 2015 1 1 24:00 -0800 2013-01-01T24:00-0800 1834
8001 2015 1 2 01:00 -0800 2013-01-02T01:00-0800 1732
8001 2015 1 2 02:00 -0800 2013-01-02T02:00-0800 954