#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