提问人:ANetTow 提问时间:9/8/2023 更新时间:9/8/2023 访问量:21
strftime 将所有时间值强制到午夜,如果一个条目没有 HH:MM
strftime coerces all time values to midnight if one entry doesn't have HH:MM
问:
我有一个字符串中的日期和时间列表,并且 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")
答:
0赞
thelatemail
9/8/2023
#1
问题是调用 ,然后调用 ,然后尝试在此转换后应用 for 输出。strftime
as.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"
评论