我有一个这样的数据框。时间跨度为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
答案 0 :(得分:2)
如果没有重复的天数,则可以按以下方式计算每月和每年的天数:
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)]
答案 1 :(得分:2)
chron和bizdays包处理工作日,但实际上都没有包含可用的假期日历,限制了它们的用途。
假设您已定义假日的.Holidays
向量,我们将在下面使用chron。 (如果您不运行以下代码而仅将工作日视为工作日,因为chron提供的默认.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