【问题标题】:Converting factor in different formats to date in R在R中将不同格式的因子转换为日期
【发布时间】:2021-09-16 14:30:38
【问题描述】:

我有一个数据框 data2 和不同格式的变量 x.date

[1] "42250"      "14/03/2015" "14/03/2015" "42311"     
   [5] "42158"      "42158"      "19/03/2015" "19/03/2015"
   [9] "19/03/2015" "19/03/2015" "19/03/2015" "18/03/2015"

如果我尝试以下操作,我需要将其转换为 dd/mm/yyyy 格式:

as.Date(data2$x.date format = "%m/%d/%Y")

我收到了 NA:

[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
  [20] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

有什么办法可以解决这个问题?

【问题讨论】:

  • 您指定的format= 需要匹配您的数据,或者至少匹配其中的一部分,才能工作。 14/03/2015 和其他类似的例子是 "%d/%m/%Y" 而不是 "%m/%d/%Y"

标签: r dataframe date


【解决方案1】:

如果只有这两种格式,可以试试

library(dplyr)
library(lubridate)

df %>% 
  mutate(date = format(coalesce(dmy(x.date),
                                as_date(as.integer(x.date), origin = "1900-01-01")),
                       "%d-%m-%Y")) %>% 
  suppressWarnings()

返回

   col1     x.date       date
1     a      42250 05-09-2015
2     b 14/03/2015 14-03-2015
3     c 14/03/2015 14-03-2015
4     d      42311 05-11-2015
5     e      42158 05-06-2015
6     f      42158 05-06-2015
7     g 19/03/2015 19-03-2015
8     h 19/03/2015 19-03-2015
9     i 19/03/2015 19-03-2015
10    j 19/03/2015 19-03-2015
11    k 19/03/2015 19-03-2015
12    l 18/03/2015 18-03-2015

注意:我不确定哪个日期是您的 42250 格式的正确来源。这可能是 1899/12/31 或 1899/12/30 或 1900/01/01。

数据

structure(list(col1 = c("a", "b", "c", "d", "e", "f", "g", "h", 
"i", "j", "k", "l"), x.date = c("42250", "14/03/2015", "14/03/2015", 
"42311", "42158", "42158", "19/03/2015", "19/03/2015", "19/03/2015", 
"19/03/2015", "19/03/2015", "18/03/2015")), class = "data.frame", row.names = c(NA, 
-12L))

【讨论】:

    【解决方案2】:

    首先您需要获取 Date 类中的数据,然后使用format 可以获取任何格式的数据。

    这是一个基本的 R 方法 -

    #Create a column to save dates
    data2$dates <- as.Date(NA)
    #Find out dates which has only numbers
    inds <- grepl('^\\d+$', data2$x.date)
    #Change excel date to R date
    data2$dates[inds] <- as.Date(as.numeric(data2$x.date[inds]), origin = "1899-12-30")
    #For remaining ones use dmy format to change the dates
    data2$dates[!inds] <- as.Date(data2$x.date[!inds], '%d/%m/%Y')
    #change the format of dates. 
    data2$dates <- format(data2$dates, '%d/%m/%Y')
    
    #[1] "03/09/2015" "14/03/2015" "14/03/2015" "03/11/2015" "03/06/2015" "03/06/2015"
    #[7] "19/03/2015" "19/03/2015" "19/03/2015" "19/03/2015" "19/03/2015" "18/03/2015"
    

    【讨论】:

    • 有没有可能在一个作业中做到这一点data2$dates[inds]data2$dates[!inds]?我想不通...
    • dplyr::if_else(inds, as.Date(as.numeric(data2$x.date), origin = "1899-12-30"), as.Date(data2$x.date, '%d/%m/%Y')) 有效但返回警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2020-11-17
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多