我有一个字符串形式的日期和时间列表,并且午夜值在字符串中没有 HH:MM,因为它们被归零到最近的小时。我正在尝试在 R 中使用 strftime 来获取相同格式的所有日期时间字符串。
如果任何字符串没有 HH:MM 值,则所有返回的日期时间字符串都将设置为 00:00。此行为在将 R 更新到 4.3.1 后开始出现。
这条线按预期工作:
strftime(c("2021-08-09 04:00:00", "2021-08-10 06:00"), format = "%Y-%m-%d %H:%M")
这条线将一切强制到午夜:
strftime(c("2021-08-09 04:00:00", "2021-08-10"), format = "%Y-%m-%d %H:%M")
问题是
strftime
调用 as.POSIXlt(x)
,然后调用 as.POSIXlt.character(x)
,然后尝试将 format=
应用于 output after 此转换。
最终成功的转换由
tryFormats=
中的
as.POSIXlt.character(x)
参数决定
对于这两个值来说唯一可以成功的格式是
"%Y-%m-%d"
,所以这就是你得到的,并且小时数被删除。例如:
strftime
#function (x, format = "", tz = "", usetz = FALSE, ...)
#format(as.POSIXlt(x, tz = tz), format = format, usetz = usetz, ...)
args(as.POSIXlt.character)
#function (x, tz = "", format, tryFormats = c("%Y-%m-%d %H:%M:%OS",
# "%Y/%m/%d %H:%M:%OS", "%Y-%m-%d %H:%M", "%Y/%m/%d %H:%M",
# "%Y-%m-%d", "%Y/%m/%d"), optional = FALSE, ...)
#NULL
x <- c("2021-08-09 04:00:00", "2021-08-10")
as.POSIXlt(x, tryFormats=c("%Y-%m-%d %H:%M"))
#Error in as.POSIXlt.character(x, tryFormats = c("%Y-%m-%d %H:%M")) :
# character string is not in a standard unambiguous format
as.POSIXlt(x, tryFormats=c("%Y-%m-%d %H:%M", "%Y-%m-%d"))
#[1] "2021-08-09 AEST" "2021-08-10 AEST"
这与您所看到的相符:
strftime(x)
#[1] "2021-08-09" "2021-08-10"
strftime(x, format="%Y-%m-%d %H:%M")
#[1] "2021-08-09 00:00" "2021-08-10 00:00"
为了解决这个问题,您需要使用一些适当的逻辑来填写缺失的时间:
ifelse(nchar(x)==10, paste(x, "00:00:00"), x)
#[1] "2021-08-09 04:00:00" "2021-08-10 00:00:00"
现在也可以在
strftime
中使用,但这可能是多余的:
strftime(ifelse(nchar(x)==10, paste(x, "00:00:00"), x))
#[1] "2021-08-09 04:00:00" "2021-08-10 00:00:00"