将大型数据框字符串列转换为日期时间 - 无法解释的行为
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()
,它会分别转换每一行,产生预期的结果,除了不一致(它会在每一行中寻找合适的格式,而不是一种适用于所有人的格式)。
我有一个包含日期和时间信息作为字符串的文件。我想将它转换为日期时间 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()
,它会分别转换每一行,产生预期的结果,除了不一致(它会在每一行中寻找合适的格式,而不是一种适用于所有人的格式)。