2016-05-06 6 views
-1

私は1つの列がdatetimesの束をリストするデータフレームを持っています。奇妙なことに、その列のデータ型は「整数」です。私はPOSIXctのような適切なdatetimeデータ型に列を強制して、別のフィールドのタイムスタンプからこれらのタイムスタンプを引くことができるようにする必要があります。しかし、これらのdatetime値をPOSIXctに強制しようとすると、時間コンポーネントが失われます。別のデータ型に強制的に変換せずにdatetimeで数式を実行しようとすると、Rはタイムスタンプの時間要素が存在しないかのように動作します(各日付には深夜の時間があるものとみなされます)。何が起こっているのですか?Rがタイムスタンプを認識できるように修正するにはどうしたらいいですか?Rはdatetime値の時間成分を認識しません

> dates[1] 
[1] 2016-05-05T16:46:21-04:00 
48 Levels: 2016-05-03T06:45:42-04:00 2016-05-03T06:45:43-04:00 ... 2016-05-05T16:50:00-04:00 
> typeof(dates) 
[1] "integer" 
> as.POSIXct(dates[1]) 
[1] "2016-05-05 EDT" 
> as.character(dates[1]) 
[1] "2016-05-05T16:46:21-04:00" 
> as.POSIXct(as.character(dates[1])) 
[1] "2016-05-05 EDT" 
+0

「48レベル」は、Rがそれを要因として扱うというヒントです。 'read.csv'を使用した場合は、' stringAsFactors = F'を使用してください。 – rbm

+0

あなたは標準でない日時フォーマットを持っています。 Rは、おそらく、 '.SOSIXct(" 2016-05-05T16:46:21-04:00 "、format ="%Y-%m-%dT%H:%M:%S ")のような助けを必要とします。' –

答えて

2

あなたはコントロールの適切なレベルでタイムスタンプを変換するtz引数でas.POSIXctを使用することができます。

タイムゾーンはすべてUTC-04の場合は00、それはあなたの地域のタイムゾーンである、あなたが使用することができます。

dates = as.POSIXct(dates, format="%Y-%m-%dT%H:%M:%S", tz=Sys.timezone()) 

を、彼らはすべてUTC-04の場合は00、それはあなたの地域のタイムゾーンではありませんが、

dates = as.POSIXct(dates, format="%Y-%m-%dT%H:%M:%S", tz="Etc/GMT-4") 
:あなたは、一般的なGMT-4タイムゾーンを使用することができ、また

dates = as.POSIXct(dates, format="%Y-%m-%dT%H:%M:%S", tz="America/Port_of_Spain") 

:あなたは、あなたがtz databaseから適切なタイムゾーンを指定することができ、正確な場所を知っています

[編集:下記の彼のコメントのためにRolandに感謝します。元々strptimeを使用しましたが、同じ構文を使用しますが、POSIXltオブジェクトを返します。]

+1

'as.POSIXct'も同様に使用できます。 'strptime'が返すPOSIXltよりも一般的に望ましいPOSIXctオブジェクトを提供します。 – Roland

+0

ありがとう、私はそれに応じて私の答えを修正しました。 – ajrwhite

+0

これは完全に機能しました。ありがとう! – user3786999

関連する問題