2016-08-17 4 views
0

Ich versuche, eine Tag-Nummer innerhalb des Jahres zu Monat/Tag Format zu konvertieren.konvertieren Tag-Nummer innerhalb des Jahres in Monat/Tag Format

Mit dieser df:

set.seed(123) 
df1 <- data.frame(Year = rep(15,100), DayNum = seq(78,177,1), Hour = sample(0:23,100,replace = T)) 
df2 <- data.frame(Year = rep(16,100), DayNum = seq(78,177,1), Hour = sample(0:23,100,replace = T)) 

df <- rbind(df1, df2) 
> head(df) 
    Year DayNum Hour 
1 15  78 6 
2 15  79 18 
3 15  80 9 
4 15  81 21 
5 15  82 22 
6 15  83 1 
> tail(df) 
    Year DayNum Hour 
195 16 172 22 
196 16 173 11 
197 16 174 9 
198 16 175 15 
199 16 176 3 
200 16 177 13 

, die für das Jahr 2015 100 Datensätze hat und 2016, wie kann ich eine POSIXct Datum/Zeit-Spalte zu machen?

Während es eine Reihe von verwandten Posts mit einem julianischen Datum von einem Anfangsursprung gibt (normalerweise 1970-01-01), konnte ich keine Posts mit einer Tagnummer innerhalb eines Jahres und mit einem variablen Jahr (d 2015 und 2016).

+0

Das ist kein Julianisches Datum, es ist nur die Tagesnummer innerhalb des Jahres. _Julian Datum_ hat eine klare Definition - _ "Julianischer Tag ist die ununterbrochene Zählung der Tage seit dem Anfang der Julianischen Periode, die hauptsächlich von Astronomen benutzt wird." _ - mit 0 = 1. Januar, 4713 BC. – Aganju

+0

Sie können Ihren Ursprung so ändern, wie Sie möchten, zum Beispiel: 2015-01-01' – jgadoury

+0

@Aganju Ich habe die Frage bearbeitet, um Ihren Kommentar zu reflektieren. –

Antwort

1

Sie könnten so etwas wie dieses benötigen, %j verwenden Sie den Tag des Jahres zu spezifizieren:

strptime(with(df, paste(Year, DayNum, Hour)), "%y %j %H") 

# [1] "2015-03-19 06:00:00 EDT" 
# [2] "2015-03-20 18:00:00 EDT" 
# [3] "2015-03-21 09:00:00 EDT" 
# [4] "2015-03-22 21:00:00 EDT" 
# [5] "2015-03-23 22:00:00 EDT" 
2

Die as.POSIXct Funktion hat eine Option, den Ursprung Datum angeben, wenn von einem „Julian“ Datum auf das Datum/Uhrzeit-Objekt konvertieren:

#calculate the origin date based on the year column 
df$origin<-as.Date(paste0("20", df$Year,"-01-01")) 
#convert the Julian day to a date/time object 
as.POSIXct(df$JulianDay, origin=df$origin) 

Man kann das Hinzufügen der Zeitzone-Option auf Vollständigkeit prüfen muß:

as.POSIXct(df$JulianDay, origin=df$origin, tz="GMT") 
Verwandte Themen