2010-12-30 20 views
6

Tengo varios años de datos (solo para días hábiles (no fines de semana o días festivos)) en un marco de datos [r] y me gustaría encontrar la diferencia entre los datos del 2do y 5to día hábil de cada mes. Por lo tanto, la solución debe ir a través de la lista, determinar el segundo y quinto día hábil, obtener los datos y la fecha completa para las fechas correspondientes y luego encontrar la diferencia.r - búsqueda de diferencia entre días hábiles

los datos se parece a:

1/19/1990 1.22 

1/20/1990 1.25 

1/23/1990 1.26 ## (Gap in date is weekend) 

... 

2/1/1990 1.34 

2/2/1990 1.36 

2/5/1990 1.22 ## (Gap in date is weekend) 

He intentado usar fechaHora() pero no perjudicar los fines de semana y días festivos. Cualquier sugerencia sería apreciada, gracias.

+0

Honestamente, acabo de entender la pregunta cuando leo la respuesta de Dirk. –

+0

http://stackoverflow.com/questions/38448310/r-finding-difference-in-business-days/38448463#38448463 – Sathish

Respuesta

2

que suponer que por el segundo y el quinto día hábil Quiere decir que 2º y 5º día de datos que está realmente presente en los datos de cada mes. Si esa es la pregunta, entonces es la siguiente. Leemos en los datos y convertimos la primera columna a la clase "Date". Luego agregamos los datos por mes tomando la diferencia requerida.

Lines <- "1/19/1990 1.22 
1/20/1990 1.25 
1/23/1990 1.26 
1/24/1990 1.26 
1/25/1990 1.26 
1/26/1990 1.26 
2/1/1990 1.34 
2/2/1990 1.36 
2/5/1990 1.22 
2/6/1990 1.22 
2/7/1990 1.22 
2/8/1990 1.22" 

DF <- read.table(text = Lines, col.names = c("Date", "Value")) 
DF$Date <- as.Date(DF$Date, "%m/%d/%Y") 
aggregate(DF$Value, list(ym = format(DF$Date, "%Y-%m")), 
    function(x) if (length(x) >= 5) x[5] - x[2] else NA) 

Usando zoológico y Chron que se puede hacer en su totalidad a través de read.zoo:

library(zoo) 
library(chron) 
read.zoo(text = Lines, FUN = chron, FUN2 = as.yearmon, 
    aggregate = function(x) if (length(x) >= 5) x[5] - x[2] else NA) 

actualización Dado que este fue escrito por primera vez el argumento text=-read.table y read.zoo se añadió en R y la respuesta ha sido actualizado para usar esto.

+0

Eso es exactamente lo que necesitaba ... ¡Muchas gracias! – acesnap

16

El tipo básico Date funciona por días naturales, pero no por días hábiles. Necesita una lógica extra para ocuparse de los días hábiles. Soy consciente de dos esfuerzos:

  1. el paquete timeDate que es parte de rMetrics tiene una serie de calendarios

  2. mi paquete RQuantLib puede hacer lo mismo, apoyándose en la lógica de QuantLib

Aquí hay solo dos ejemplos de RQuantLib, hay una serie de otras funciones relacionadas:

R>  from <- as.Date("2009-04-07") 
R>  to <-as.Date("2009-04-14") 
R>  getHolidayList("UnitedStates", from, to) 
NULL 
R>  to <- as.Date("2009-10-7") 
R>  getHolidayList("UnitedStates", from, to) 
[1] "2009-05-25" "2009-07-03" "2009-09-07" 
R>  

y

R>  from <- as.Date("2009-04-07") 
R>  to<-as.Date("2009-04-14") 
R>  businessDaysBetween("UnitedStates", from, to) 
[1] 5 
R> 
+1

Creo que debe tenerse en cuenta que el "día hábil" no está muy bien definido fuera de un dominio en particular . Por ejemplo, muchas oficinas gubernamentales están cerradas el día de Columbus, pero la Bolsa de Nueva York no lo está. – frankc

+1

Puede elegir qué "calendario" necesita: UnitedStates, UnitedStates/Settlement, UnitedStates/NYSE, UnitedStates/GovernmentBond, UnitedStates/NERC y WeekendsOnly. – nvogen

1

Aquí hay una pequeña función que le permite ingresar una fecha de inicio, fecha de finalización y un vector de fechas que corresponden a vacaciones (útil si está usando un calendario de vacaciones no estándar) y devuelve el número de días hábiles entre ellas, contando tanto la fecha de inicio y fin

workdays = function(iniDate, endDate, holidays) { 
    theDates = seq(from=iniDate,to=endDate,by="day") 
    isHoliday = theDates %in% holidays 
    isWeekend = (as.POSIXlt(theDates)$wday) %in% (c(0,6)) 
    return (sum(!isHoliday & !isWeekend)) 
} 
1

usted puede ver la diferencia entre días laborables utilizando el paquete de bizdays, pero usted debe tener una lista de días (días no laborables) y que no es su caso. De todos modos, creo que puede ayudar a otros.

Con bizdays, el siguiente código calcularía la cantidad de días hábiles entre 2 fechas.

library(bizdays) 
cal <- Calendar(holidaysANBIMA, weekdays=c('sunday', 'saturday'), dib=252) 
from_dates <- c('2013-07-12', '2012-06-13') 
to_dates <- seq(as.Date('2014-02-17'), as.Date('2016-07-21'), by='months') 
bizdays(from_dates, to_dates, cal = cal) 

## [1] 153 442 194 483 234 526 276 570 321 613 364 655 404 695 
## [15] 446 735 486 779 529 822 571 863 614 904 654 946 695 987 
## [29] 738 1029 

EDIT:

Desde la versión 1.0.0 bizdays viene con algunas construida en calendarios

library(bizdays) 
from_dates <- c('2013-07-12', '2012-06-13') 
to_dates <- seq(as.Date('2014-02-17'), as.Date('2016-07-21'), by='months') 
bizdays(from_dates, to_dates, cal = "Brazil/ANBIMA") 

quedará obsoleta La función Calendar.

Cuestiones relacionadas