我有一个包含日期和时间信息的文件作为字符串。我想将它转换为日期时间POSIXlt对象,为此我在R中使用strftime()基函数。
虽然当我传递一个字符串时,或者当我将它应用于数据帧的一小部分时,该命令正常工作,但当我将它应用于更大的片段或整个数据帧时,它无法捕获小时。请参阅以下内容:
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 :(得分:0)
我无法确切地说,但是你的DateTime变量可能存在一些不一致。由于它似乎是一个字符变量,当转换的矢量化版本发现意外行为时,它将无法很好地处理它,因为相同的转换应用于每个条目(它将使用适用于所有情况的格式),这可能是它在切片中起作用的原因。我建议逐渐增加切片大小,以便跟踪出现不一致的位置(可能有更聪明的方法来检查)。
另一个注意事项是strftime
要求其第一个参数可以转换为POSIXlt,因此我建议传递一个POSIXlt对象以避免您的函数选择如何转换原始字符串。你可以使用例如:
t = strftime(strptime(d, format = "%Y-%m-%d %H:%M:%OS"), format = "%Y-%m-%d %H:%M")
然后,希望通过strptime
将您的字符变量转换为POSIXlt时,会因为行不一致而抛出错误。
第三个但不是很好的解决方案是使用rowwise()
,什么会分别转换每一行,产生除了不一致之外的预期结果(它在每一行中寻找合适的格式,而不是一行适合所有人的格式。)