web-dev-qa-db-fra.com

Séquence R des dates avec lubrification

Salut, j'essaie d'obtenir une séquence de dates avec lubrification

Ça ne marche 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')

le fait, mais j'aimerais savoir s'il existe une façon élégante de le faire avec du lubrifiant.

MODIFIER

Veuillez ignorer: je me suis résolu, donc je ne laisse que la postérité. Heureux de l'avoir supprimé si nécessaire.

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

Est-ce que l'astuce

56
Tahnoon Pasha

ymd est un wrapper pour analyser les chaînes de date et renvoie un objet POSIXct.

Vous devez simplement utiliser la terminologie standard décrite dans ?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 pouvez contraindre l'objet de classe lubridatePeriod à un difftime, mais cela semble plutôt inutile

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

C'est un moyen de rester dans l'univers POSIXct de lubridate et de ne pas changer les formats de date pour baser les POSIXt de R. J'évite de changer le format de date dans mes scripts car je trouve que c'est un endroit commun où des bugs (par exemple des changements de fuseau horaire ou des horodatages perdus) sont introduits. Il suit ce conseil pour 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 habitué + fonctionne aussi parfois, mais le %m+% empêche les 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 que %m+ n'était qu'un moyen d'ajouter des mois, et des commandes lubridate similaires comme %y+% etc. n'existent pas. Mais, il s'avère que le "m" ne signifie pas "ajout de mois". Ma meilleure supposition est "magique" =)

4
rrr