如果一个条目没有 HH:MM,strftime 会将所有时间值强制为午夜

问题描述 投票:0回答:1

我有一个字符串形式的日期和时间列表,并且午夜值在字符串中没有 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")

r datetime-format strftime floor
1个回答
0
投票

问题是

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"
© www.soinside.com 2019 - 2024. All rights reserved.