99 votes

Séquence de rendez-vous avec lubridate

Bonjour, j'essaie d'obtenir une séquence de dates avec lubridate.

Cela ne fonctionne pas.

seq(ymd('2012-04-07'),ymd('2013-03-22'),by=week(1))

la commande de base

seq(as.Date('2012-04-7'),as.Date('2013-03-22'),'weeks')

mais j'aimerais savoir s'il existe un moyen élégant de le faire avec lubridate.

EDITAR

Merci d'ignorer : je me suis résolu et je le laisse pour la postérité seulement. Je suis prêt à supprimer ce message si nécessaire.

seq(ymd('2012-04-07'),ymd('2013-03-22'),by='weeks')

Fait l'affaire

110voto

mnel Points 48160

ymd est une enveloppe permettant d'analyser les chaînes de dates et renvoie un fichier POSIXct objet.

Il suffit d'utiliser la terminologie standard décrite dans le document ?seq.POSIXt (pas lubridate ) pour définir les semaines

seq(ymd('2012-04-07'),ymd('2013-03-22'), by = '1 week')
seq(ymd('2012-04-07'),ymd('2013-03-22'), by = 'weeks')

fonctionnera

comme le fera

seq(ymd('2012-04-07'),ymd('2013-03-22'), by = '2 week')

Vous pourriez contraindre le lubridate Period à un objet de classe difftime mais cela semble plutôt inutile

seq(ymd('2012-04-07'),ymd('2013-03-22'), by = as.difftime(weeks(1)))

12voto

rrr Points 426

C'est une façon de rester dans le cadre de la POSIXct univers de lubridate et ne pas changer les formats de date en fonction des R de base POSIXt . J'évite de changer le format de la date dans mes scripts car je trouve que c'est un endroit fréquent où des bugs (par exemple des changements de fuseaux horaires ou des pertes d'horodatage) sont introduits. Il suit ce conseil d'utiliser %m+% : R : ajout d'un mois à une date

# example date is a leap day for a "worst case scenario"
library("lubridate")
posixct.in <- parse_date_time(x = "2016-02-29", orders = "ymd")
# [1] "2016-02-29 UTC"

posixct.seq <- posixct.in %m+% years(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" "2017-02-28 UTC" "2018-02-28 UTC" "2019-02-28 UTC"

posixct.seq <- posixct.in %m+% months(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" "2016-03-29 UTC" "2016-04-29 UTC" "2016-05-29 UTC"

posixct.seq <- posixct.in %m+% days(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" "2016-03-01 UTC" "2016-03-02 UTC" "2016-03-03 UTC"

posixct.seq <- posixct.in %m+% weeks(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" "2016-03-07 UTC" "2016-03-14 UTC" "2016-03-21 UTC"

Un régulier + fonctionne aussi parfois, mais le %m+% évite des erreurs comme celle-ci :

posixct.seq <- posixct.in + years(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" NA               NA               NA

Au début, j'étais confus parce que je pensais %m+ n'était qu'un moyen d'ajouter des mois, et des similaires lubridate des commandes comme %y+% etc. n'existent pas. Mais, il s'avère que le "m" ne signifie pas "ajout de mois". Je dirais plutôt "magie" =)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X