一个月中计算日期观测次数

3

我有一个数据框,其中包含股票交易所每日价格及其相应的日期,涵盖多年。这些日期是交易日期,因此不包括周末和假期。例如:

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

我使用lubridate提取一个包含每个日期所在月份的列,但我困惑于如何创建一列,用于计算每年每个月中的第几个交易日。例如,从示例开始,一个计数器会从2017-04-03开始,因为这是该月的第一个观测值,而不是3,因为它是该月的第三天,并在该月的最后一个观测值结束。因此,该列将如下所示:

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

而不是

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

有没有人能帮助我?

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,因为它是该月的第一天交易日。这适用于如果您的数据框按照从最早日期到最新日期的顺序进行排序。


非常感谢,这个完美地解决了我的问题!在此基础上我还有一个问题:如果我想要提取一个月中最后三个交易日和下个月的前五个交易日的价格,并将其存储在一个新的数据框中,你有什么建议吗? - rookie
你是在谈论特定的月份还是所有月份?顺便说一句,随时可以将其作为一个单独的问题提出 :) - peter
最好是针对数据集中的所有月份。当然,我也可以将其作为单独的问题发布! - rookie

0

可以使用 lubridatedplyr 来提取日期组件的方法。

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

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")))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接