首页 > 解决方案 > 如何将 R 中的数值更改为日期?

问题描述

嗨,这个问题一直困扰着我一段时间。

所以我试图将我的 R 项目中的所谓日期转换为实际日期。现在日期以数字方式排列,即 2/28/2020 之后不是 2020 年 3 月 1 日,而是 2020 年 2 月 3 日。

我试过了

as.Date(3/14/2020, origin = "14-03-2020")

并且

df <- data.frame(Date = c("10/9/2009 0:00:00", "10/15/2009 0:00:00"))
 as.Date(df$Date, "%m/%d/%Y %H:%M:%S")

 strDates <- c("01/28/2020", "05/03/2020")%>%
  dates <- as.Date(strDates, "%m/%d/%Y")

我只是插入了两个日期来测试它是否有效,因为大约有 40 个日期。但是,我的输出如下:

Error in as.Date.default(., 3/14/2020, origin = "14-03-2020") : do not know how to convert '.' to class “Date” 

对于第一个,然后

第二个是:

data frame not found 

第三个是

Error in as.Date(strDates, "%m/%d/%Y") : object 'strDates' not found

标签: rnumbers

解决方案


您的代码存在问题:

  1. as.Date(3/14/2020, origin = "14-03-2020")

    首先,R 将替换3/14/20200.000106082,因为这就是 3 除以 14 除以 2020 等于。您需要使用单引号或双引号将其标识为字符串,如:as.Date("3/14/2020", origin = "14-03-2020")

  2. 但这仍然被打破。转换为 时Date,如果您提供character(字符串)输入,则可能需要提供format=,因为它需要知道字符串中的哪些数字对应于年、月、日等。如果您提供numeric(或integer)输入,则您确实需要提供origin=,以便它知道“第 0 天”是什么。对于 unix,epoch 是你所需要的,所以origin="1970-01-01". 如果您使用 Excel 中的日期,则需要origin="1899-12-30"(请参阅https://stackoverflow.com/a/43230524)。

  3. 您的下一个错误是因为您将 magrittr ops 与 ... base R 混合在一起。

     strDates <- c("01/28/2020", "05/03/2020")%>%
      dates <- as.Date(strDates, "%m/%d/%Y")
    

    这里的问题与日期无关。第 1 行的使用%>%是获取第 1 行的输出(在 R 中,对变量的赋值不可见地返回分配的数字,这就是链接赋值起作用的原因,a <- b <- 2)并将其作为下一个函数调用中的第一个参数注入。有了这个,您的代码最终被解释为

     strDates <- c("01/28/2020", "05/03/2020")%>%
       { dates <- as.Date(., strDates, "%m/%d/%Y") }
    

    这显然不是您想要或需要的。我怀疑这只是感到沮丧的产物,并且正在从管道转换为其他东西的中期阶段%>%,而您忘记清理%>%s. 这可能是

    dates <- c("01/28/2020", "05/03/2020") %>%
      as.Date("%m/%d/%Y")
    dates
    # [1] "2020-01-28" "2020-05-03"
    
  4. 您的 data.frame 代码似乎工作正常,尽管您没有将新分配的Date值分配回框架。试试这个轻微的改编:

    df <- data.frame(Date = c("10/9/2009 0:00:00", "10/15/2009 0:00:00"))
    df$Date <- as.Date(df$Date, "%m/%d/%Y %H:%M:%S")
    df
    #         Date
    # 1 2009-10-09
    # 2 2009-10-15
    str(df)
    # 'data.frame': 2 obs. of  1 variable:
    #  $ Date: Date, format: "2009-10-09" "2009-10-15"
    

推荐阅读