2

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

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

我已经使用 lubridate 来提取包含每个日期所在月份的列,但我努力的是创建一个列,用于为每年的每个月创建一个列,计算该月的交易日数。例如,从 2017 年 4 月 3 日开始,计数器将从 1 开始,因为这是该月的第一次观察,而不是 3,因为它是该月的第三天,并在该月的最后一次观察结束。这样该列将如下所示:

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

并不是

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

有没有人可以帮助我?

4

3 回答 3

0

也许这有帮助:

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

于 2020-10-01T10:28:02.807 回答
0

有一种方法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
于 2020-10-01T10:33:41.397 回答
0

您可以尝试以下方法:

  • 对于每个日期,找出该月的第一天。
  • 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")))
于 2020-10-01T10:33:52.640 回答