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

strftime coerces all time values to midnight if one entry doesn't have HH:MM

提问人:ANetTow 提问时间:9/8/2023 更新时间:9/8/2023 访问量:21

问:

我有一个字符串中的日期和时间列表,并且 midnight 值在字符串中没有 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 下限

评论


答:

0赞 thelatemail 9/8/2023 #1

问题是调用 ,然后调用 ,然后尝试在此转换应用 for 输出strftimeas.POSIXlt(x)as.POSIXlt.character(x)format=

最终成功的转换是由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"