R POSIXct returns NA with “03/12/2017 02:17:13”

落爺英雄遲暮 提交于 2021-02-10 06:01:16

问题


I have a data set containing the following date, along with several others

03/12/2017 02:17:13

I want to put the whole data set into a data table, so I used read_csv and as.data.table to create DT which contained the date/time information in date. Next I used

DT[, date := as.POSIXct(date, format = "%m/%d/%Y %H:%M:%S")]

Everything looked fine except I had some NA values where the original data had dates. The following expression returns an NA

as.POSIXct("03/12/2017 02:17:13", format = "%m/%d/%Y %H:%M:%S")

The question is why and how to fix.


回答1:


Just use functions anytime() or utctime() from package anytime

R> library(anytime)
R> anytime("03/12/2017 02:17:13")
[1] "2017-03-12 01:17:13 CST"
R> 

or

R> utctime("03/12/2017 02:17:13")
[1] "2017-03-11 20:17:13 CST"
R> 

The real crux is that time did not exists in North America due to DST. You could parse it as UTC as UTC does not observer daylight savings:

R> utctime("03/12/2017 02:17:13", tz="UTC")
[1] "2017-03-12 02:17:13 UTC"
R> 

You can express that UTC time as Mountain time, but it gets you the previous day:

R> utctime("03/12/2017 02:17:13", tz="America/Denver")
[1] "2017-03-11 19:17:13 MST"
R>

Ultimately, you (as the analyst) have to provide as to what was measured. UTC would make sense, the others may need adjustment.




回答2:


My solution is below but ways to improve appreciated.

The explanation for the NA is that in the mountain time zone in the US, that date and time is in the window of the switch to daylight savings where the time doesn't exist, hence NA. While the time zone is not explicitly specified, I guess R must be picking it up from the computer's time, which is in "America/Denver"

The solution is to explicitly state the date/time string is in UTC and then convert back as follows:

time.utc <- as.POSIXct("03/12/2017 02:17:13", format = "%m/%d/%Y %H:%M:%S", tz = "UTC")

> time.utc
[1] "2017-03-12 02:17:13 UTC"
> 

Next, add 6 hours to the UTC time which is the difference between UTC and MST

time.utc2 <- time.utc + 6 * 60 * 60

> time.utc2
[1] "2017-03-12 08:17:13 UTC"
> 

Now convert to America/Denver time using daylight savings.

time.mdt <- format(time.utc2, usetz = TRUE, tz = "America/Denver")

> time.mdt
[1] "2017-03-12 01:17:13 MST"
> 

Note that this is in standard time, because daylight savings doesn't start until 2 am.

If you change the original string from 2 am to 3 am, you get the following

> time.mdt
[1] "2017-03-12 03:17:13 MDT"
> 

The hour between 2 and 3 is lost in the change from standard to daylight savings but the data are now correct.



来源:https://stackoverflow.com/questions/44606738/r-posixct-returns-na-with-03-12-2017-021713

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!