J'ai une colonne de dates au format: 16juin10 et je voudrais extraire le jour julien. J'ai plusieurs années.
J'ai essayé les fonctions julian et mdy.date et cela ne semble pas fonctionner.
Essayez ce qui suit pour convertir de la classe character
(c'est-à-dire du texte) en classe POSIXlt
, puis extrayez le jour julien (yday
):
tmp <- as.POSIXlt("16Jun10", format = "%d%b%y")
tmp$yday
# [1] 166
Pour plus de détails sur les paramètres des fonctions:
?POSIXlt
?DateTimeClasses
Une autre option consiste à utiliser une classe Date
, puis à utiliser format
pour extraire un jour julien (notez que cette classe définit les jours juliens entre 1: 366, tandis que POSIXlt vaut 0: 365):
tmp <- as.Date("16Jun10", format = "%d%b%y")
format(tmp, "%j")
# [1] "167"
De même:
require(lubridate)
x = as.Date('2010-06-10')
yday(x)
[1] 161
Notez également que l'utilisation de lubrifiant:
> dmy('16Jun10')
[1] "2010-06-16 UTC"
Vous pouvez utiliser le package insol
de R qui a une fonction JD(x, inverse=FALSE)
qui convertit POSIXct en Julian Day Number (JDN).
insol
le package a également JDymd(year,month,day,hour=12,minute=0,sec=0)
pour les dates personnalisées.
Pour afficher toute la date julienne (JD), vous devez éventuellement définir options(digits=16)
.
my.data = read.table(text = "
OBS MONTH1 DAY1 YEAR1
1 3 1 2012
2 3 31 2012
3 4 1 2012
4 4 30 2012
5 5 1 2012
6 5 31 2012
7 6 1 2012
8 6 30 2012
9 7 1 2012
10 7 31 2012
", header = TRUE, stringsAsFactors = FALSE)
my.data$MY.DATE1 <- do.call(paste, list(my.data$MONTH1, my.data$DAY1, my.data$YEAR1))
my.data$MY.DATE1 <- as.Date(my.data$MY.DATE1, format=c("%m %d %Y"))
my.data$my.julian.date <- as.numeric(format(my.data$MY.DATE1, "%j"))
my.data
Retours, ce qui est techniquement incorrect car les dates juliennes ne reviennent pas à 1 le premier jour de chaque janvier:
http://en.wikipedia.org/wiki/Julian_day
Les dates ci-dessous sont des dates ordinales:
OBS MONTH1 DAY1 YEAR1 MY.DATE1 my.julian.date
1 1 3 1 2012 2012-03-01 61
2 2 3 31 2012 2012-03-31 91
3 3 4 1 2012 2012-04-01 92
4 4 4 30 2012 2012-04-30 121
5 5 5 1 2012 2012-05-01 122
6 6 5 31 2012 2012-05-31 152
7 7 6 1 2012 2012-06-01 153
8 8 6 30 2012 2012-06-30 182
9 9 7 1 2012 2012-07-01 183
10 10 7 31 2012 2012-07-31 213
Voici mes versions R de code écrites à l'origine en APL et converties en J. la date.
#* toJulian: convert 3-element c(Y,M,D) timestamp into pseudo-Julian day number.
toJulian<- function(TS3)
{ mm<- TS3[2]
xx<- 0
if( mm<=2) {xx<- 1}
mm<- (12*xx)+mm
yy<- TS3[1]-xx
nc<- floor(0.01*yy)
jd<- floor(365.25*yy)+floor(30.6001*(1+mm))+TS3[3]+1720995+(2-(nc-floor(0.25*nc)))
return(jd)
#EG toJulian c(1959,5,24) -> 2436713
#EG toJulian c(1992,12,16) -> 2448973
}
Voici la fonction inverse:
#* toGregorian: convert pseudo-Julian day number to timestamp in form c(Y,M,D)
# (>15 Oct 1582). Adapted from "Numerical Recipes in C" by Press,
# Teukolsky, et al.
toGregorian<- function(jdn)
{ igreg<- 2299161 # Gregorian calendar conversion day c(1582,10,15).
ja<- floor(jdn)
xx<- 0
if(igreg<=ja){xx<- 1}
jalpha<- floor((floor((xx*ja)-1867216)-0.25)/36524.25)
ja<- ((1-xx)*ja) + ((xx*ja)+1+jalpha-floor(0.25*jalpha))
jb<- ja+1524
jc<- floor(6680+((jb-2439870)-122.1)/365.25)
jd<- floor(365.25*jc)
je<- floor((jb-jd)/30.6001)
id<- floor((jb-jd)-floor(30.6001*je))
mm<- floor(je-1)
if(12<mm){mm<- mm-12}
iyyy<- floor(jc-4715)
if(mm>2){iyyy<- iyyy-1}
if(0>iyyy){iyyy<- iyyy-1}
Gd<- c(iyyy, mm, id)
return(Gd)
#EG toGregorian 2436713 -> c(1959,5,24)
#EG toGregorian 2448973 -> c(1992,12,16)
}