Как узнать, сколько торговых дней в каждом месяце в R?

#r

#r

Вопрос:

У меня есть фрейм данных, подобный этому. Временной промежуток составляет 10 лет. Потому что это данные китайского рынка, а в Китае лунные праздники. Итак, в каждом году разное время праздников по западному календарю.

В праздничные дни фондовый рынок не открывается, поэтому это неторговый день. Выходные тоже являются неторговыми днями.

Я хочу выяснить, в каком месяце какого года наименьшее количество торговых дней, и, самое главное, какое это число.

Повторяющихся дней не бывает.

         date change   open   high    low  close volume
1 1995-01-03 -1.233 637.72 647.71 630.53 639.88 234518
2 1995-01-04  2.177 641.90 655.51 638.86 653.81 422220
3 1995-01-05 -1.058 656.20 657.45 645.81 646.89 430123
4 1995-01-06 -0.948 642.75 643.89 636.33 640.76 487482
5 1995-01-09 -2.308 637.52 637.55 625.04 625.97 509851
6 1995-01-10 -2.503 616.16 617.60 607.06 610.30 606925
  

Комментарии:

1. Вы можете проверить с помощью bizdays пакета

Ответ №1:

Если дни не повторяются, вы можете посчитать дни в месяце и году по:

    library(data.table)                                                                                                                                                                                                                "maxx"))), .Names = c("X2005", "X2006", "X2007", "X2008"))
    library(lubridate)
    dt <- as.data.table(dt)
    dt_days <- dt[, .(count_day=.N), by=.(year(date), month(date))]
  

Тогда вам нужно сделать это только для получения минимального:

 dt_days[count_day==min(count_day)]
  

Ответ №2:

Пакеты chron и bizdays имеют дело с рабочими днями, но ни один из них фактически не содержит удобный календарь праздников, ограничивающий их полезность.
Мы будем использовать приведенный ниже chron, предполагая, что вы определили .Holidays вектор дат, которые являются праздничными днями. (Если вы запустите приведенный ниже код, не делая этого, только дни недели будут рассматриваться как рабочие дни, поскольку в .Holidays векторе по умолчанию, предоставленном chron, очень мало дат.) DF имеет 120 строк (по одной строке на каждый год / месяц), а последняя строка заменяет это только на месяц в каждом году, имеющий наименьшее количество рабочих дней.

 library(chron)
library(zoo)

st <- as.yearmon("2001-01")
en <- as.yearmon("2010-12")
ym <- seq(st, en, 1/12)  # sequence of year/months of interest

# no of business days in each yearmonth
busdays <- sapply(ym, function(x) {
  s <- seq(as.Date(x), as.Date(x, frac = 1), "day")
  sum(!is.weekend(s) amp; !is.holiday(s))
})

# data frame with one row per year/month
yr <- as.integer(ym)
DF <- data.frame(year = yr, month = cycle(ym), yearmon = ym, busdays)

# data frame with one row per year
wx.min <- ave(busdays, yr, FUN = function(x) which.min(x) == seq_along(x))
DF[wx.min == 1, ]
  

предоставление:

     year month  yearmon busdays
2   2001     2 Feb 2001      20
14  2002     2 Feb 2002      20
26  2003     2 Feb 2003      20
38  2004     2 Feb 2004      20
50  2005     2 Feb 2005      20
62  2006     2 Feb 2006      20
74  2007     2 Feb 2007      20
95  2008    11 Nov 2008      20
98  2009     2 Feb 2009      20
110 2010     2 Feb 2010      20