2016-12-19 5 views
0

Ich versuche, die folgenden Daten nach Pentad Daten zu unterteilen. Pentad bedeutet nicht überlappender 5-Tage-Durchschnitt. Schaltjahre, 12 Pentad enthält 29. Februar (6 Tage im Durchschnitt statt 5):Subset Daten basierend auf Pentad Daten mit Schaltjahr

Link to Data

Link to pentad dates

Hier ist mein Code:

library(stringr) 
dat  <- read.csv("tc_filt_1981-2007.csv",header = T,sep = ",") 

dat$Date = paste(dat$Year, str_pad(dat$Month,2,'left','0'), str_pad(dat$Day,2,'left','0'), sep='-') 
dat$yday = as.POSIXlt(dat$Date)$yday + 1 
dat$pentad = ceiling(dat$yday/5) 
df<-split(dat, dat$pentad) 

Problem:

Die dat $ y Linie funktioniert nur für 365 Tage. In einem bestimmten Jahr sollte es nur 73 Pentaden geben. Mein Code oben produziert 74 Pentads, wenn ich die dat $ pentad überprüfe. Das df enthält die Datenrahmen für jede Pentade.

Ich habe folgende zur Überprüfung:

test<-dat[which(dat$pentad == 74),] 

Ausgang:

SN  CY Year Month Day Hour Lat Lon Cat Date yday pentad 
200034 34 2000 12 31 0 12.7 128.2 TS 2000-12-31 366  74 
200034 34 2000 12 31 6 13.3 128.8 TS 2000-12-31 366  74 
200034 34 2000 12 31 12 13.9 129.7 TS 2000-12-31 366  74 
200034 34 2000 12 31 18 14.4 130.6 TS 2000-12-31 366  74 

Frage:

  1. Wie kann ich für das Schaltjahr in meinem Code-Konto?

Kann jemand vorschlagen, wie kann ich das tun?

Vielen Dank,

+0

Was ist die Definition von _pentad_ sagen über Schaltjahre? Wird der 29. Februar fallen gelassen? Oder wird Pentad 12, das vom 29. Februar bis zum 1. März reicht, aus 6 statt 5 Tagen bestehen? – Uwe

+0

@UweBlock. Du hast Recht. Für Schaltjahre hat Pentad 12 6 Tage anstelle von 5 Tagen. Pentad bedeutet nicht überlappender Durchschnitt. – ichabod

+0

Nachdem nun die Definition von Pentaden in einem Schaltjahr geklärt wurde, können Sie versuchen, eine Liste der Pentad-Startdaten für ein Jahr zu erhalten, eine zweite Liste erstellen, die die gesamte Zeitspanne Ihrer Daten abdeckt, und) 'auf Ihren Daten. – Uwe

Antwort

1

Minor Einstellung:

library(lubridate) 
dat$pentad = ceiling((dat$yday - leap_year(dat$Year)*(dat$yday > 59))/5) 
+1

Bitte beachten Sie, dass der Code für das Jahr 1900 fehlschlägt, das ein gewöhnliches Jahr ist. Ich schlage vor, 'lubridate :: leap_year()' zu verwenden. – Uwe

+0

@UweBlock. Danke für Ihren Vorschlag. Ich werde das versuchen. – ichabod

Verwandte Themen