【问题标题】:How can I create range of date given the start date and end date给定开始日期和结束日期,如何创建日期范围
【发布时间】:2020-12-23 06:41:11
【问题描述】:

我正在使用 sqldf 库来操作 R 中的数据框。目前,我有一个这样的数据框:

ID       Start_Date       End_Date
1          08-29           09-01

我想创建一个新的数据框,使用 sqldf 创建一个介于 Start_Date 和 End_Date 之间的日期范围,例如对于 ID1,我希望最终的数据框如下所示:

ID        Date_Range      
1           08-29   
1           08-30   
1           08-31
1           09-01

我想我可以创建一个新的数据框。但我想知道是否可以在 sqldf 中实现?

【问题讨论】:

  • 我认为这是您正在寻找的帖子 - stackoverflow.com/questions/11494511/… 但它没有 sqldf 答案。
  • @RonakShah 它不能使用 POSIXt 类型并报告错误“seq.POSIXt(Start_Day, End_Day) 中的错误: 'to', 'by' 和 'length.out' 中的两个错误/ 'along.with' 必须指定"
  • 我看到你更新了你的数据,所以现在你有 Start_Date, End_date 作为字符而不是 POSIXct ?您是否也愿意接受其他解决方案或只寻找sqldf 答案?
  • @RonakShah Start_Date 和 End_Date 是 POSIXct 类型。我尝试使用您发送给我的链接中的方法。但它似乎不起作用。
  • POSIXct 类型中不能只有月份和日期信息。也许使用dput 共享数据可能有助于澄清您实际拥有的数据。我已根据您显示的内容添加了答案。

标签: r sqldf


【解决方案1】:

这是使用tidyverse 函数扩展日期范围的一种方法。

library(dplyr)

df %>%
  mutate(across(ends_with('Date'), as.Date, '%m-%d'), 
         #You don't need the above if columns are already of type date/POSIXct
         Date_Range = purrr::map2(Start_Date, End_Date, seq, by = '1 day')) %>%
  tidyr::unnest(Date_Range) %>%
  mutate(Date_Range = format(Date_Range, '%m-%d')) %>%
  select(-Start_Date, -End_Date)

#     ID Date_Range
#  <int> <chr>     
#1     1 08-29     
#2     1 08-30     
#3     1 08-31     
#4     1 09-01     

数据

df <- structure(list(ID = 1L, Start_Date = "08-29", End_Date = "09-01"), 
      class = "data.frame", row.names = c(NA, -1L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多