簡體   English   中英

計算一個月內的日期觀察

[英]Count date observations in a month

我有一個數據框,其中包含幾年內相應日期的證券交易所的每日價格。 這些日期是交易日期,因此不包括周末和節假日。 前任:

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

我已經使用 lubridate 來提取一個包含每個日期所在月份的列,但我努力創建一個列,為每年的每個月計算它是當月的哪個交易日。 即從示例中可以看出,一個計數器將從 2017-04-03 的 1 開始,因為這是該月的第一次觀察,而不是 3,因為它是該月的第三天,並在該月的最后一次觀察時結束。 這樣該列將如下所示:

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

並不是

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

有沒有人可以幫助我?

也許這有幫助:

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 從第一個日期到最新日期排序,則此方法有效。

有一種使用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

您可以嘗試以下操作:

  • 對於每個日期,找出該月的第一天。
  • 計算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")))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM