将字符串的大型dataframe列转换为datetime - 无法解释的行为

时间:2017-11-18 11:39:36

标签: r datetime time strftime datetime-conversion

我有一个包含日期和时间信息的文件作为字符串。我想将它转换为日期时间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

如何解释这种不稳定的行为以及如何转换整个数据集的日期时间列?

您的建议将不胜感激。

1 个答案:

答案 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(),什么会分别转换每一行,产生除了不一致之外的预期结果(它在每一行中寻找合适的格式,而不是一行适合所有人的格式。)