2017-06-17 49 views
2

我有一個包含以下日期的數據集,與其他幾個人[R POSIXct返回NA與「2017年3月12日2時十七分13秒」

03/12/2017 02:17:13 

沿着我希望把整個數據集分成一個數據表,所以我用read_csvas.data.table來創建包含日期的日期/時間信息的DT。 接下來我用

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

一切似乎都很正常,除了我有一些NA值,其中原始數據有日期。以下表達式返回不適用

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

問題是爲什麼以及如何解決。

+0

您可能需要提供數據以向我們展示發生的情況。我的想法是,當它們是字符串時,你可能會在這些值中存在間距問題,但在我看到一些示例之前我無法確認 – akash87

+0

我懷疑這是'.Internal(as.POSIXct(x,tz))中的一個錯誤'。如果你追蹤'as.POSIXct(x,format,tz =「America/Denver」)',它首先調用'as.POSIXlt(...)'這個工作,然後調用'as.POSIXct.POSIXlt'不。奇。 – r2evans

+0

我不認爲它是我的錯誤或打字不當。當夏令時開始時,真的沒有上午2點到3點。轉到此鏈接(https://www.worldtimebuddy.com/united-states-colorado-denver-to-utc)並將其設置爲3月12日,2017年。時鐘不停地滴滴答答,但是現在凌晨3點,MDT將會是凌晨2點。 – JerryN

回答

0

我的解決方案如下,但提高讚賞的方式。

NA的解釋是,在美國的山區時區,日期和時間處於切換到夏令時的窗口中,因爲時間不存在,因此NA。雖然時區沒有明確規定,但我猜R必須從計算機的時間,這是在「美國/丹佛」

撿起它的解決方案是明確指出日期/時間字符串是UTC,然後轉換回如下:

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" 
> 

接下來,添加6小時,以UTC時間是

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

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

現在使用夏令轉換爲美/丹佛時間UTC和MST

之間的差。

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

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

請注意,這是標準的時候,因爲夏令時不啓動,直到凌晨2點。

如果從凌晨2點改變原來的字符串到凌晨3點,您會收到以下

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

2和3之間的時間是失去了從標準到夏令時的變化,但現在的數據是正確的。

2

只需使用功能anytime()utctime()從包裝anytime

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

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

真正的癥結在於當時沒有存在於北美,由於DST。

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

您可以表達UTC時間爲山的時間,但它可以讓你的前一天:

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

最終,你(作爲UTC不觀察者夏令時你可以分析它作爲UTC作爲分析師)必須提供什麼被測量。 UTC有意義,其他可能需要調整。

相關問題