微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 lubridate

如何解决使用 lubridate

我正在从 csv 文件导入数据,其中日期列包含以不同格式记录的日期。我希望解析该列,使其具有 date 类,并且所有日期的格式都相同(即 %d-%m-%Y)。我希望使用 lubridate,因为我有一些使用它的经验并希望更好地使用它。

我在 Parsing dates with different formatsParsing dates in multiple formats in R using lubridate 处寻找答案,但我发现答案不完整。

通常,当我导入 csv 数据时,我会像这样更改 col_types

potatoes <- read_csv("data/potato_prices.csv",col_types = cols(
           DATE = col_date(format = "%Y-%m-%d"),'M04003DE00BERM372NNBR' = col_double())) %>% 
           rename("Price" = "M04003DE00BERM372NNBR")

但由于我的 DATE 列包含不同格式的日期,因此格式不为 "%Y-%m-%d" 的日期返回 NA,并且列的类别显示为未知。

我尝试了 col_guess,而不是使用具有确切日期格式的 col_date 指定,然后使用以下代码更改 DATE 列,但它没有按我希望的那样工作。

potatoes <- read_csv("data/potato_prices.csv",col_types = cols(
                      DATE = col_guess(),'M04003DE00BERM372NNBR' = col_double())) 

potatoes <- potatoes %>% 
  mutate(DATE = parse_date_time(DATE,orders = c("Ymd","dmY"))) %>%
  rename("Price" = "M04003DE00BERM372NNBR")

这是我的数据在 excel 中以 csv 格式显示的示例

DATE <- c("1879-01-01","1879-02-01","1879-03-01","1879-04-01","1/05/1990","1/06/1990","1/07/1990","1/08/1990","1/09/1990","1/10/1990")
Price <- c("23","17.9","17.8","18","20","22","19","17.2","15")

spuds <- data.frame(DATE,Price)

我希望有一个两列的小标题;日期为 col_date 类,价格为 col_double 类。然后我将使用 ggplot 创建绘图,我认为如果我的 DATE 列在课堂日期中会最简单。

谢谢

解决方法

以下函数将尝试在其参数 format 中传递的几种日期格式。它使用 lubridate 函数 guess_formats 以获取基于该参数的可能格式。

as_Date <- function(x,format = c("ymd","dmy","mdy")){
  fmt <- lubridate::guess_formats(x,format)
  fmt <- unique(fmt)
  y <- as.Date(x,format = fmt[1])
  for(i in seq_along(fmt)[-1]){
    na <- is.na(y)
    if(!any(na)) break
    y[na] <- as.Date(x[na],format = fmt[i])
  }
  y
}

formats <- c("ymd","dmy")
as_Date(spuds$DATE,formats)
#[1] "1879-01-01" "1879-02-01" "1879-03-01" "1879-04-01"
#[5] "1990-05-01" "1990-06-01" "1990-07-01" "1990-08-01"
#[9] "1990-09-01" "1990-10-01"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。