【问题标题】:Count date observations in a month计算一个月内的日期观察
【发布时间】:2020-10-01 10:22:07
【问题描述】:

我有一个数据框,其中包含数年对应日期的证券交易所每日价格。这些日期是交易日期,因此不包括周末和节假日。例如:

df$date <- c(as.Date("2017-03-30", "2017-03-31", "2017-04-03", "2017-04-04")

我已经使用 lubridate 提取了一个包含每个日期所在月份的列,但我努力创建一个列,为每年的每个月创建一个列,计算该月的交易日数。 IE。在示例中,计数器将从 2017-04-03 的 1 开始,因为这是该月的第一个观测值,而不是 3,因为它是该月的第三天,并在该月的最后一个观测值结束。使列看起来像这样:

df$DayofMonth <- c(22, 23, 1, 2)

而不是

df$DayofMonth <- c(30, 31, 3, 4)

有没有人可以帮助我?

【问题讨论】:

    标签: r date dayofmonth


    【解决方案1】:

    也许这会有所帮助:

    library(data.table)
    library(stringr)
    df <-  setDT(df)
    df[,YearMonth:=str_sub(Date,1,7)]
    df[, DayofMonth := seq(.N), by = YearMonth]
    

    您有一个名为 YearMonth 的列,其值类似于“2020-01”。 然后对于每个组(月),您为每个日期指定一个索引,在您的情况下该索引对应于交易日。

    如您所见,这将导致日期“2017-04-03”为 1,因为它是该月的第一个交易日。如果您的 df 从第一个日期到最新日期排序,则此方法有效。

    【讨论】:

    • 非常感谢,效果很好!基于此答案的另一个问题;如果我想提取一个月的最后 3 个交易日和下个月的前 5 个交易日的价格并将其存储在新的数据框中,您对如何执行此操作有任何建议吗?
    • 您是在谈论特定月份还是所有月份?顺便说一句,请随时将此作为一个单独的问题提出:)
    • 最好用于数据集中的所有月份。当然,我也可以将其作为单独的问题发布!
    【解决方案2】:

    有一种方法使用lubridate 提取日期组件和dplyr

    library(dplyr)
    library(lubridate)
    df <- data.frame(date = as.Date(c("2017-03-30", "2017-03-31", "2017-04-03", "2017-04-04")))
    df %>%
      mutate(month = month(date),
             year = year(date),
             day = day(date)) %>%
      group_by(year, month) %>%
      mutate(DayofMonth = day - min(day) + 1) 
    # A tibble: 4 x 5
    # Groups:   year, month [2]
      date       month  year   day DayofMonth
      <date>     <dbl> <dbl> <int>      <dbl>
    1 2017-03-30     3  2017    30          1
    2 2017-03-31     3  2017    31          2
    3 2017-04-03     4  2017     3          1
    4 2017-04-04     4  2017     4          2
    

    【讨论】:

      【解决方案3】:

      您可以尝试以下方法:

      • 对于每个日期,找出该月的第一天。
      • 计算first_day_of_month 和当前日期之间存在多少个工作日。
      library(dplyr)  
      library(lubridate)
      
      df %>%
        mutate(first_day_of_month = floor_date(date, 'month'), 
               day_of_month = purrr::map2_dbl(first_day_of_month, date, 
               ~sum(!weekdays(seq(.x, .y, by = 'day')) %in% c('Saturday', 'Sunday'))))
      
      #        date first_day_of_month day_of_month
      #1 2017-03-30         2017-03-01           22
      #2 2017-03-31         2017-03-01           23
      #3 2017-04-03         2017-04-01            1
      #4 2017-04-04         2017-04-01            2
      

      如果不需要,您可以删除 first_day_of_month 列。

      数据

      df <- data.frame(Date = as.Date(c("2017-03-30", "2017-03-31", 
                                        "2017-04-03", "2017-04-04")))
      

      【讨论】:

        猜你喜欢
        • 2014-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        • 2015-01-20
        相关资源
        最近更新 更多