2010-12-30 19 views
6

Ich habe mehrere Jahre Daten (nur für Werktage (keine Wochenenden oder Feiertage)) in einem [r] Datenrahmen und möchte den Unterschied zwischen den Daten auf der 2. und 5. Geschäftstag eines jeden Monats. Also muss die Lösung durch die Liste gehen, den 2. und 5. Werktag ermitteln, die Daten und das ganze Datum für die entsprechenden Daten abrufen und dann den Unterschied finden.r - Finde den Unterschied zwischen den Arbeitstagen

die Daten wie folgt aussehen:

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) 

ich versucht habe, mit Datums- und Uhrzeit(), aber es ist Handicap nicht für Wochenenden und Feiertage. Irgendwelche Vorschläge würden geschätzt, danke.

+0

Ehrlich gesagt, habe ich die Frage gerade verstanden, als ich Dirks Antwort gelesen habe. –

+0

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

Antwort

2

Ich gehe davon aus, dass Sie das 2. und 5. Tag der Daten bedeuten, durch die 2. und 5. Arbeitstag, die tatsächlich in den Daten für jeden Monat ist. Wenn das die Frage ist, dann ist es wie folgt. Wir lesen die Daten ein und konvertieren die erste Spalte in "Date" Klasse. Dann aggregieren wir die Daten nach Monaten unter Berücksichtigung der erforderlichen Differenz.

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) 

aktualisieren Da dies wurde zum ersten Mal geschrieben, um das text= Argument read.table und read.zoo wurde in R und die Antwort hinzugefügt:

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) 

Mit Zoo und chron kann über read.zoo vollständig durchgeführt werden aktualisiert, um dies zu verwenden.

+0

Genau das habe ich gebraucht .... Vielen Dank !!!! – acesnap

16

Der grundlegende Typ Date funktioniert für Kalendertage, aber nicht für Werktage. Sie brauchen zusätzliche Logik, um sich um die Arbeitstage zu kümmern. Ich bin mir dessen bewusst zwei Bemühungen:

  1. das timeDate-Paket, das Teil rMetrics ist hat eine Reihe von Kalendern

  2. mein RQuantLib Paket so tun, kann von QuantLib in der Logik, indem sie sich

Hier sind nur zwei Beispiele von RQuantLib, es gibt eine Reihe von verwandten anderen Funktionen:

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>  

und

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

Ich denke, es sollte beachtet werden, dass "Geschäftstag" außerhalb einer bestimmten Domäne nicht super gut definiert ist . Zum Beispiel sind viele Regierungsämter am Columbus Day geschlossen, aber die New York Stock Exchange ist nicht. – frankc

+1

Sie können wählen, welche "Kalender" Sie benötigen: UnitedStates, United States/Settlement, USA/NYSE, United States/GovernmentBond, United States/NERC und WeekendsOnly. – nvogen

1

Hier ist eine kleine Funktion, mit der Sie ein Startdatum, ein Enddatum und einen Vektor von Daten eingeben können, die Feiertagen entsprechen (nützlich, wenn Sie einen nicht standardmäßigen Feiertagskalender verwenden) und die Anzahl der Arbeitstage zwischen ihnen zurückgibt. sowohl die Anfangs- und Enddatum

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

Zählen können Sie den Unterschied zwischen Werktagen finden das Paket mit bizdays, aber Sie müssen eine Liste der Feiertage (arbeitsfreie Tage) und das ist nicht Ihr Fall. Jedenfalls denke ich, dass es anderen helfen kann.

Mit bizdays würde der folgende Code die Anzahl der Geschäftstage zwischen 2 Daten berechnen.

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:

Seit Version 1.0.0 bizdays kommt mit ein paar in Kalender gebaut

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") 

Die Calendar Funktion als veraltet wird.

Verwandte Themen