web-dev-qa-db-fra.com

Convertir un vecteur de date en jour julien en R

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.

16
user3166363

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"
24
Marc in the box

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"
20
John

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

7
Andrei
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
3
Mark Miller

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)
}
2
DevonMcC