【问题标题】:R: readxl and date formatR:readxl 和日期格式
【发布时间】:2022-06-28 13:17:32
【问题描述】:

我读入了一个 excel 文件,其中 1 列包含不同格式的日期:excel 格式(例如 43596)和文本(例如“01.01.2020”)。 要转换excel格式,可以使用as.Date(as.numeric(df$date), origin = "1899-12-30") 转换文本可以使用as.Date(df$date, format = "%d.%m.%Y") 这些适用于个人价值观,但是当我尝试 ifelse 时:

df$date <- ifelse(length(df$date)==5, 
            as.Date(as.numeric(df$date), origin = "1899-12-30"),
            as.Date(df$date, format = "%d.%m.%Y"))

或for循环:

  for (i in length(x)) {
  if(nchar(x[i])==5) {
    y[i] <- as.Date(as.numeric(x[i]), origin = "1899-12-30")
  } else {x[i] <- as.Date(x[i], , format = "%d.%m.%Y"))}
  } print(x)

它不起作用,因为:

“字符串不是标准的明确格式”

也许您可以建议一种更好的解决方案来转换/替换适当的不同日期格式?

【问题讨论】:

  • 你能提供dput(head(df))吗?
  • 你好@Waldi。 ```结构(列表(合同= c(231429、231437、231449、231459、231463、231466),日期= c(“43596”,“07.01.2020”,“01.01.2021”,“03.03.2020”, "44131", "40619")), row.names = c(NA, -6L), class= c("tbl_df", "tbl", "data.frame"))

标签: r readxl


【解决方案1】:

我有 2 个解决方案。

  1. 更改代码,我不喜欢,因为您依赖 xlsx 日期格式:
> df <- tibble(date = c("01.01.2020","43596"))
> 
> df$date <- as.Date(ifelse(nchar(df$date)==5, 
+                           as.Date(as.numeric(df$date), origin = "1899-12-30"),
+                           as.Date(df$date, format = "%d.%m.%Y")), origin = "1970-01-01")
Warning message:
In as.Date(as.numeric(df$date), origin = "1899-12-30") :
  NAs introducidos por coerción
> 
> df$date
[1] "2020-01-01" "2019-05-11"
>
  1. 将文档保存为 CSV 并使用 readr 包中的 read_csv() 函数。这解决了一切!!!!

【讨论】:

    【解决方案2】:

    您可以使用sapplyifelse 应用于每个值:

    df$date <- as.Date(sapply(df$date,function(date) ifelse(nchar(date)==5, 
                                         as.Date(as.numeric(date), origin = "1899-12-30"),
                                         as.Date(date, format = "%d.%m.%Y"))),
                       origin="1970-01-01")
    df
    
    # A tibble: 6 x 2
      contract date      
         <dbl> <date>    
    1   231429 2019-05-11
    2   231437 2020-01-07
    3   231449 2021-01-01
    4   231459 2020-03-03
    5   231463 2020-10-27
    6   231466 2011-03-17
    

    【讨论】:

      【解决方案3】:

      使用rowwisetidyverse 解决方案

      library(dplyr)
      library(lubridate)
      
      df %>% 
        rowwise() %>% 
        mutate(date_new=as.Date(ifelse(grepl("\\.",date),
          as.character(dmy(date)),
          as.character(as.Date(as.numeric(date), origin="1899-12-30"))))) %>% 
        ungroup()
      # A tibble: 6 × 3
        contract date       date_new  
           <dbl> <chr>      <date>    
      1   231429 43596      2019-05-11
      2   231437 07.01.2020 2020-01-07
      3   231449 01.01.2021 2021-01-01
      4   231459 03.03.2020 2020-03-03
      5   231463 44131      2020-10-27
      6   231466 40619      2011-03-17
      

      【讨论】:

        猜你喜欢
        • 2014-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多