计算一个月内的日期观察
Count date observations in a month
我有一个数据框,其中包含几年对应日期的证券交易所每日价格。这些日期是交易日期,因此不包括周末和节假日。例如:
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)
有没有人可以帮助我?
也许这有帮助:
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")))
我有一个数据框,其中包含几年对应日期的证券交易所每日价格。这些日期是交易日期,因此不包括周末和节假日。例如:
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)
有没有人可以帮助我?
也许这有帮助:
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")))