2017-11-18 186 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(),什么会分别转换每一行,产生预期的结果,除了不一致(它会寻找适当的格式在每一行,而不是一种格式为了所有人)。

相关问题