2017-11-18 130 views
0

我有一個包含日期和時間信息的文件作爲字符串。我想將它轉換爲日期時間POSIXlt對象,併爲此我在R中使用strftime()基函數。R中的字符串轉換爲日期時間 - 無法解釋的行爲

雖然命令正常工作時我通過它字符串,或者當我將它應用一個小當我將它應用於更大的片或整個數據幀時,它無法捕獲小時。請看下面:

d = "2017-11-18 01:00:00" 
t = strftime(d, format = "%Y-%m-%d %H:%M") 
t 
'2017-11-18 01:00' 

head(data %>% dplyr::slice(1:1000) %>% mutate(DateTime1 = strftime(DateTime, format = "%Y-%m-%d %H:%M"))) 
DateTime Junction Vehicles ID DateTime1 
2015-11-01 00:00:00 1 15 20151101001 2015-11-01 00:00 
2015-11-01 01:00:00 1 13 20151101011 2015-11-01 01:00 
2015-11-01 02:00:00 1 10 20151101021 2015-11-01 02:00 
2015-11-01 03:00:00 1 7 20151101031 2015-11-01 03:00 
2015-11-01 04:00:00 1 9 20151101041 2015-11-01 04:00 
2015-11-01 05:00:00 1 6 20151101051 2015-11-01 05:00 

head(data %>% mutate(DateTime1 = strftime(DateTime, format = "%Y-%m-%d %H:%M"))) 
DateTime Junction Vehicles ID DateTime1 
2015-11-01 00:00:00 1 15 20151101001 2015-11-01 00:00 
2015-11-01 01:00:00 1 13 20151101011 2015-11-01 00:00 
2015-11-01 02:00:00 1 10 20151101021 2015-11-01 00:00 
2015-11-01 03:00:00 1 7 20151101031 2015-11-01 00:00 
2015-11-01 04:00:00 1 9 20151101041 2015-11-01 00:00 
2015-11-01 05:00:00 1 6 20151101051 2015-11-01 00:00 

這種反常行爲是如何被解釋的,我怎麼能轉換日期時間列整個數據集?

您的建議將不勝感激。

+0

打印數據數據框中的行 – skrubber

+0

使用'dput()'打印數據集的結構和內容。 –

+0

您是否嘗試過使用lubridate函數?例如:data%>%mutate(DateTime1 = lubridate :: ymd_hms(DateTime))。 –

回答

0

我無法確切地說,但是您的DateTime變量可能存在一些不一致。由於它似乎是一個字符變量,因此當您的轉換的矢量化版本發現意外行爲時,它不會很好地處理它,因爲對每個條目都應用相同的轉換(它將使用適用於所有情況的格式),這可能是它在一個切片中工作的原因。我建議要麼逐漸增加您的切片大小,以追蹤出現不一致的地方(可能有更聰明的方法來檢查它)。

另一個需要注意的是,strftime要求其第一個參數可以轉換爲POSIXlt,所以我建議傳遞一個POSIXlt對象來避免你的函數選擇如何轉換你的原始字符串。您可以使用,例如:

t = strftime(strptime(d, format = "%Y-%m-%d %H:%M:%OS"), format = "%Y-%m-%d %H:%M") 

然後,希望你的字符變量轉換爲POSIXlt當這樣你希望它是,通過strptime,它會拋出一個錯誤由於不一致行。

第三,但不是一個好的解決方案是使用rowwise(),什麼會分別轉換每一行,產生預期的結果,除了不一致(它會尋找適當的格式在每一行,而不是一種格式爲了所有人)。

相關問題