将大型数据框字符串列转换为日期时间 - 无法解释的行为

Conversion of large dataframe column of string to datetime - unexplainable behavior

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

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

我们将不胜感激您的建议。

我说不清楚,但您的 DateTime 变量中可能存在一些不一致。由于它似乎是一个字符变量,当您的转换的矢量化版本发现意外行为时,它不会很好地处理它,因为相同的转换应用于每个条目(它将使用适用于所有情况的格式),这可能就是它在切片中起作用的原因。我建议要么逐渐增加切片大小,以跟踪出现不一致的位置(可能有更智能的方法来检查它)。

另一个注意事项是 strftime 要求其第一个参数可转换为 POSIXlt,因此我建议传递一个 POSIXlt 对象以避免您的函数选择如何转换原始字符串。您可以使用例如:

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

然后,希望当通过 strptime 将您的字符变量转换为您期望的 POSIXlt 时,它会因行不一致而引发错误。

第三种但不是很好的解决方案是使用 rowwise(),它会分别转换每一行,产生预期的结果,除了不一致(它会在每一行中寻找合适的格式,而不是一种适用于所有人的格式)。