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

У меня есть такой фрейм данных.Промежуток времени составляет 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

Ответы [ 2 ]

2 голосов
/ 30 марта 2019

Пакеты 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) & !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
2 голосов
/ 30 марта 2019

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

   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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...