R中用于字符串到日期转换的“标准明确日期”格式是什么?

jucafojl  于 2023-02-20  发布在  其他
关注(0)|答案(8)|浏览(146)

请考虑以下几点

$ R --vanilla

> as.Date("01 Jan 2000")
Error in charToDate(x) :
    character string is not in a standard unambiguous format

但是这个日期显然是标准格式的,为什么会出现错误消息呢?
更糟糕的是,一个模棱两可的日期显然是接受没有警告或错误,然后读错了!

> as.Date("01/01/2000")
[1] "0001-01-20"

我在[R]标记中搜索并找到了包含此错误消息的其他28个问题。所有问题都有解决方案和变通方法,涉及指定格式iiuc。此问题的不同之处在于我问的是标准的明确格式在哪里定义,它们可以更改吗?是每个人都收到这些消息还是只有我收到?可能与区域设置有关?
换句话说,有没有比指定格式更好的解决方案?
29 questions containing "[R] standard unambiguous format"

> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252
[2] LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base
nhn9ugyo

nhn9ugyo1#

这是记录的行为。从?as.Date
format:字符串。如果未指定,它将在第一个非“NA”元素上尝试“"%Y-%m-%d”“,然后尝试”"%Y/%m/%d”“,如果两者都不起作用,则给予错误。
as.Date("01 Jan 2000")生成错误,因为格式不是上面列出的两种格式之一。as.Date("01/01/2000")生成错误答案,因为日期不是上面列出的两种格式之一。
我认为“标准明确”的意思是“ISO-8601”(尽管as.Date并不那么严格,因为“%m/%d/%Y”不是ISO-8601)。
如果收到此错误,解决方案是使用?strptime中的Details部分中描述的格式指定日期(或日期时间)的格式。
确保转换规范的 order 以及任何 * separator * 与 input 字符串的格式完全对应。此外,如果数据包含日/月名称和/或缩写,请务必特别小心,因为转换将取决于您的区域设置(请参阅?strptime和read ?LC_TIME中的示例;也参见strptime , as.POSIXct and as.Date return unexpected NA)。

dojqjjoe

dojqjjoe2#

换句话说,有没有比指定格式更好的解决方案?
是的,现在有(即在2016年底),感谢anytime::anydateanytime包。
有关上述示例,请参见以下内容:

R> anydate(c("01 Jan 2000", "01/01/2000", "2015/10/10"))
[1] "2000-01-01" "2000-01-01" "2015-10-10"
R>

正如你所说,这些事实上是 * 明确的 *,应该只是工作。并通过anydate()他们这样做。没有格式。

wooyq4lh

wooyq4lh3#

作为@JoshuaUlrich答案的补充,下面是函数as.Date.character的定义:

as.Date.character
function (x, format = "", ...) 
{
    charToDate <- function(x) {
        xx <- x[1L]
        if (is.na(xx)) {
            j <- 1L
            while (is.na(xx) && (j <- j + 1L) <= length(x)) xx <- x[j]
            if (is.na(xx)) 
                f <- "%Y-%m-%d"
        }
        if (is.na(xx) || !is.na(strptime(xx, f <- "%Y-%m-%d", 
            tz = "GMT")) || !is.na(strptime(xx, f <- "%Y/%m/%d", 
            tz = "GMT"))) 
            return(strptime(x, f))
        stop("character string is not in a standard unambiguous format")
    }
    res <- if (missing(format)) 
        charToDate(x)
    else strptime(x, format, tz = "GMT")
    as.Date(res)
}
<bytecode: 0x265b0ec>
<environment: namespace:base>

因此,基本上,如果strptime(x, format="%Y-%m-%d")strptime(x, format="%Y/%m/%d")都抛出NA,则认为它是模糊的,如果不是明确的,则认为它是模糊的。

sdnqo3pr

sdnqo3pr4#

转换日期而不指定当前格式很容易导致此错误。

以下是一个示例:

sdate <- "2015.10.10"

转换而不指定格式:

date <- as.Date(sdate4) # ==> This will generate the same error"""Error in charToDate(x): character string is not in a standard unambiguous format""".

转换为指定格式:

date <- as.Date(sdate4, format = "%Y.%m.%d") # ==> Error Free Date Conversion.
hl0ma9xz

hl0ma9xz5#

这对我来说非常有效,不管之前的日期是如何编码的。

library(lubridate)
data$created_date1 <- mdy_hm(data$created_at)
data$created_date1 <- as.Date(data$created_date1)
sxpgvts3

sxpgvts36#

作为补充:如果您尝试转换的条目是一个字符串,而该字符串本应是NA,则也会引发此错误。如果您指定了预期的格式,或者使用“真实的的”NA,则不会出现任何问题:
最小可重现示例及数据表:

library(data.table)
df <- data.table(date_good = c("01-01-2001", "01-01-2001"), date_bad= ("NA", "01-01-2001"))

df[, .(date_good = as.Date(date_good), date_bad = as.Date(date_bad))]
# Error in charToDate(x) : character string is not in a standard unambiguous format

df[, .(date_good = as.Date(date_good), date_bad = as.Date(date_bad, format="%Y-%m-%d"))]
# No errors; you simply get NA.

df2 <- data.table(date_good = c("01-01-2001", "01-01-2001"), date_bad= (NA, "01-01-2001"))
    
df2[, .(date_good = as.Date(date_good), date_bad = as.Date(date_bad))]
# Just NA
of1yzvn4

of1yzvn47#

例如,如果日期为:“01 Jan 2000”,我建议使用

library(lubridate)
date_corrected<-dmy("01 Jan 2000")
date_corrected
[1] "2000-01-01"
class(date_corrected)
[1] "Date"

Lubridate对几乎所有类型的约会都有作用。

9ceoxa92

9ceoxa928#

解决方案对我不起作用;我仍然有同样的错误。回溯说错误出现在chartoDate()函数中。
This article from Statistics Globe solved it for me
他们使用带有“anydate”函数的“anytime”包:

df <- df %>% dplyr::mutate(New_Date = as.Date(anytime::anydate(Old_Date)))

相关问题