【问题标题】:Mutating date values inside a list and obtaining the range改变列表中的日期值并获取范围
【发布时间】:2021-06-27 15:21:00
【问题描述】:

我目前正在处理一个包含格式混乱的日期的列表。我试图将它们清理成列表中的两列日期/时间,而不必从列表中提取数据框。清除日期后,我想从集合中获取最小/最大日期并创建一个包含所有日期的字符串。

我列表中的日期格式为 2019-07-20T17:12:08+10:00,我已经能够通过从列表中提取第一个数据框但不在列表中来清理它们,即:Y <- as_tibble(X[[1]])

#Clean Date Values in Y
Y <- Y %>%
  mutate(Date = str_replace_all(created_at, "T", " ")) %>%
  separate(Date, into = c("Date","Time"), sep = " ")

#Obtain the Min/Max to get date range of datasets and create a Calendar tibble
Dates <- seq(min(X$dates$Date), min(X$dates$Date), by="days")
Calendar <- as_tibble(Date)

在保留列表中的信息并从该列表中提取日期范围的同时运行 Clean Date 流程的最佳方法是什么?

示例代码:

X <- list(dates = structure(list(created_at = c("2019-06-04T13:25:57+10:00", 
"2019-06-05T06:14:29+10:00", "2019-07-09T19:20:18+10:00", "2019-07-12T11:57:28+10:00", 
"2019-07-16T01:10:49+10:00", "2019-07-20T17:12:08+10:00"), cancelled_at = c("2019-06-06T17:46:49+10:00", 
"2019-06-05T08:37:32+10:00", NA, NA, NA, NA)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"), .internal.selfref = <pointer: 0x000001b0851f1ef0>), 
    sent = c("T", "T", "T", "T", "T", "T"))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以在列表本身中分配更改的值。

    library(tidyverse)
    
    X$dates <- X$dates %>%
      mutate(Date = str_replace_all(created_at, "T", " ")) %>%
      separate(Date, into = c("Date","Time"), sep = " ") %>%
      mutate(Date = as.Date(Date))
    Dates <- seq(min(X$dates$Date), max(X$dates$Date), by="days")
    X$Calendar <- as_tibble(Dates)
    X
    
    #$dates
    # A tibble: 6 x 4
    #  created_at                cancelled_at              Date       Time          
    #  <chr>                     <chr>                     <date>     <chr>         
    #1 2019-06-04T13:25:57+10:00 2019-06-06T17:46:49+10:00 2019-06-04 13:25:57+10:00
    #2 2019-06-05T06:14:29+10:00 2019-06-05T08:37:32+10:00 2019-06-05 06:14:29+10:00
    #3 2019-07-09T19:20:18+10:00 NA                        2019-07-09 19:20:18+10:00
    #4 2019-07-12T11:57:28+10:00 NA                        2019-07-12 11:57:28+10:00
    #5 2019-07-16T01:10:49+10:00 NA                        2019-07-16 01:10:49+10:00
    #6 2019-07-20T17:12:08+10:00 NA                        2019-07-20 17:12:08+10:00
    
    #$sent
    #[1] "T" "T" "T" "T" "T" "T"
    
    #$Calendar
    # A tibble: 47 x 1
    #   value     
    #   <date>    
    # 1 2019-06-04
    # 2 2019-06-05
    # 3 2019-06-06
    # 4 2019-06-07
    # 5 2019-06-08
    # 6 2019-06-09
    # 7 2019-06-10
    # 8 2019-06-11
    # 9 2019-06-12
    #10 2019-06-13
    # … with 37 more rows
    

    【讨论】:

    • 我不知道!我试图去做的方式更加复杂:/如果我希望列时间具有正确时区的时间,它是否类似于在日期变异之后添加(时间 = hms(时间,TZ = + 10GMT)?
    • 我不确定您是否只能使用时区。您可以将其作为字符,但不会有时区属性。 ymd_hms(X$dates$created_at) 会将数据转换为 POSIXct 格式,您可以从中分别提取日期和时间。
    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多