首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R: readxl和日期格式

R: readxl和日期格式
EN

Stack Overflow用户
提问于 2022-01-28 13:29:34
回答 3查看 167关注 0票数 0

我在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")作为:

代码语言:javascript
运行
复制
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循环:

代码语言:javascript
运行
复制
  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)

它不起作用是因为:

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-28 16:35:13

您可以使用sapply对每个值应用ifelse

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2022-01-28 15:11:04

我有两个解决方案。

  1. 更改代码,我不喜欢它,因为您依赖于xlsx日期格式:

代码语言:javascript
运行
复制
> 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()函数。这解决了一切!
票数 1
EN

Stack Overflow用户

发布于 2022-01-28 17:56:34

一种使用tidyverserowwise解决方案

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70894554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档