2016-10-24 49 views
0

私は、csvファイル(.xlsxから変換)からfreadでインポートされたデータフレームを持っています。インポート後、class(inputData$timestamp)Posixctであり、attr(inputData$timestamp, "tzone")""です。csvからインポートされたタイムスタンプのタイムゾーン

としてはthisスレッドで説明し、私は一日でデータフレームを分割しようとしているが、それらは午前2時分割ます:

byDay <- split(inputData, as.Date(inputData$timestamp)) 
> byDay[[1]] 
       timestamp value 
1 2016-09-05 00:01:00  0 
2 2016-09-05 00:02:00  0 
3 2016-09-05 00:03:00  0 
[...] 
118 2016-09-05 01:58:00  0 
119 2016-09-05 01:59:00  0 

>byDay[[2]] 
       timestamp value 
120 2016-09-05 02:00:00  0 
121 2016-09-05 02:01:00  0 
122 2016-09-05 02:02:00  0 
[...] 
1558 2016-09-06 01:58:00 0 
1559 2016-09-06 01:59:00 0 

のように。

私は日付がタイムスタンプに示されているものから暗黙的に異なるであることを理解:

> byDay[[1]]$timestamp[1] 
"2016-09-05 00:01:00" 
> as.Date(byDay[[1]]$timestamp[1]) 
"2016-09-04" 

私はUTCにすべての日付を設定しようとしたので、私はタイムゾーンに興味がないよ:

> attr(inputData$timestamp, "tzone") <- "UTC" 
> byDay <- split(inputData, as.Date(inputData$timestamp)) 
> byDay[[1]] 
       timestamp apAvg 
1 2016-09-04 22:01:00  0 
2 2016-09-04 22:02:00  0 
3 2016-09-04 22:03:00  0 
[...] 
117 2016-09-04 23:57:00  0 
118 2016-09-04 23:58:00  0 
119 2016-09-04 23:59:00  0 

このタイムスタンプは実際に22:00に開始することを意味します。しかし、CSVファイルでは、最初のタイムスタンプは05.09.2016 00:00:00であり、タイムゾーンの書式が表示されません。 タイムゾーンの問題がcsvファイルから発生する可能性はありますか? またはRで間違ったタイムスタンプを処理しますか? これを正確に処理するにはどうすればよいですか?

+1

これはあなたがいないという事実の後、POSIXctに文字列から解析しているとき、あなたが本当に取り組むべき何かがある、またはそれはあなたがタイムゾーンを変更しているかどうかを非常にあいまいな取得します(つまり、時間を調整する)、または単に切り替える(つまりデータを変更する)ことができます。代わりに、 'as.POSIXct'に' tz'を指定するか、使用している構文解析関数を指定してください。 – alistaire

+0

SOについての質問方法については、[mcve]を参照してください。あなたの入力(またはそれの縮小版)がXの場合、 'dput(X)'の出力を表示します。 –

+0

@alistaire as.POSIXct'の 'tz =" "はそれを解決しました。また、後でなく、パース時にタイムゾーンを正しく取得するための一貫したアプローチ。ありがとう。 –

答えて

0

文字列から解析するときにタイムゾーンを設定する際、@ alistaireの助言に従います。

attr(inputData$timestamp, "tzone")""

その後で、""は、あなたの地域のタイムゾーンにデータを設定するためのデフォルトであるため、実際には、これが起こっているように見えます。

問題は、クラスPOSIXct入力してas.Dateを使用して、tzのデフォルトは"UTC"ではなく、ローカルタイムゾーンであるということです。

  1. があなたのsplitに使用as.Date(inputData$timestamp, tz="")"UTC"
  2. にない変更データのタイムゾーンを実行してください:あなたが欲しいものを手に入れます。

のデータがあるとしましょう、説明するために:

inputData<- structure(list(timestamp = structure(c(1473048000, 1473051600, 
1473055200, 1473058800, 1473062400, 1473066000, 1473069600, 1473073200, 
1473076800, 1473080400, 1473084000, 1473087600, 1473091200, 1473094800, 
1473098400, 1473102000, 1473105600, 1473109200, 1473112800, 1473116400, 
1473120000, 1473123600, 1473127200, 1473130800, 1473134400, 1473134460, 
1473134520, 1473134580), class = c("POSIXct", "POSIXt"), tzone = ""), 
    value = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L)), .Names = c("timestamp", "value"), row.names = c(NA, 
-28L), class = "data.frame") 
##    timestamp value 
##1 2016-09-05 00:00:00  0 
##2 2016-09-05 01:00:00  0 
##3 2016-09-05 02:00:00  0 
##4 2016-09-05 03:00:00  0 
##5 2016-09-05 04:00:00  0 
##6 2016-09-05 05:00:00  0 
##7 2016-09-05 06:00:00  0 
##8 2016-09-05 07:00:00  0 
##9 2016-09-05 08:00:00  0 
##10 2016-09-05 09:00:00  0 
##11 2016-09-05 10:00:00  0 
##12 2016-09-05 11:00:00  0 
##13 2016-09-05 12:00:00  0 
##14 2016-09-05 13:00:00  0 
##15 2016-09-05 14:00:00  0 
##16 2016-09-05 15:00:00  0 
##17 2016-09-05 16:00:00  0 
##18 2016-09-05 17:00:00  0 
##19 2016-09-05 18:00:00  0 
##20 2016-09-05 19:00:00  0 
##21 2016-09-05 20:00:00  0 
##22 2016-09-05 21:00:00  0 
##23 2016-09-05 22:00:00  0 
##24 2016-09-05 23:00:00  0 
##25 2016-09-06 00:00:00  0 
##26 2016-09-06 00:01:00  0 
##27 2016-09-06 00:02:00  0 
##28 2016-09-06 00:03:00  0 

で:

デフォルト tzパラメータで as.Dateを使用して splitを行う
attr(inputData$timestamp, "tzone") 
##[1] "" 

byDay <- split(inputData, as.Date(inputData$timestamp)) 
byDay[[1]] 
##    timestamp value 
##1 2016-09-05 00:00:00  0 
##2 2016-09-05 01:00:00  0 
##3 2016-09-05 02:00:00  0 
##4 2016-09-05 03:00:00  0 
## ... 
##17 2016-09-05 16:00:00  0 
##18 2016-09-05 17:00:00  0 
##19 2016-09-05 18:00:00  0 
##20 2016-09-05 19:00:00  0 
byDay[[2]] 
##    timestamp value 
##21 2016-09-05 20:00:00  0 
##22 2016-09-05 21:00:00  0 
##23 2016-09-05 22:00:00  0 
##24 2016-09-05 23:00:00  0 
##25 2016-09-06 00:00:00  0 
##26 2016-09-06 00:01:00  0 
##27 2016-09-06 00:02:00  0 
##28 2016-09-06 00:03:00  0 

ありませんw、私は米国の東海岸にいるので、今はEDTにいる。このため、22:00:00は、UTCの翌日までsplitになります。行うのと同じsplitas.Date(inputData$timestamp,tz="")を持つ:

byDay <- split(inputData, as.Date(inputData$timestamp,tz="")) 
byDay[[1]] 
##    timestamp value 
##1 2016-09-05 00:00:00  0 
##2 2016-09-05 01:00:00  0 
##3 2016-09-05 02:00:00  0 
##4 2016-09-05 03:00:00  0 
## ... 
##21 2016-09-05 20:00:00  0 
##22 2016-09-05 21:00:00  0 
##23 2016-09-05 22:00:00  0 
##24 2016-09-05 23:00:00  0 
byDay[[2]] 
##    timestamp value 
##25 2016-09-06 00:00:00  0 
##26 2016-09-06 00:01:00  0 
##27 2016-09-06 00:02:00  0 
##28 2016-09-06 00:03:00  0 
+0

私は@ alistaireのアプローチを使用して、まだ役立つ答え。 –

関連する問題