104 votes

Créer un vecteur de tous les jours entre deux dates

Existe-t-il un moyen simple de répertorier dans R tous les jours valides qui se sont produits entre deux dates spécifiées ? Par exemple, je voudrais les entrées suivantes :

itemizeDates(startDate="12-30-11", endDate="1-4-12")

Pour produire les dates suivantes :

"12-30-11" "12-31-11", "1-1-12", "1-2-12", "1-3-12", "1-4-12"

Je suis flexible sur les classes et le formatage des dates, j'ai juste besoin d'une implémentation du concept.

166voto

GSee Points 19079

Vous êtes à la recherche de seq

> seq(as.Date("2011-12-30"), as.Date("2012-01-04"), by="days")
[1] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03"
[6] "2012-01-04"

Ou bien, vous pouvez utiliser :

> as.Date(as.Date("2011-12-30"):as.Date("2012-01-04"), origin="1970-01-01")
[1] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03"
[6] "2012-01-04"

Voici une fonction pour répondre à votre demande spécifique

itemizeDates <- function(startDate="12-30-11", endDate="1-4-12", 
                         format="%m-%d-%y") {
  out <- seq(as.Date(startDate, format=format), 
             as.Date(endDate, format=format), by="days")  
  format(out, format)
}

> itemizeDates(startDate="12-30-11", endDate="1-4-12")
[1] "12-30-11" "12-31-11" "01-01-12" "01-02-12" "01-03-12" "01-04-12"

20voto

Yifu Yan Points 1375

Je préfère utiliser le paquet lubridate pour résoudre les problèmes de date. Il est plus intuitif et plus facile à comprendre et à utiliser une fois que vous le connaissez.

library(lubridate)
#mdy() in lubridate package means "month-day-year", which is used to convert
#the string to date object
>start_date <- mdy("12-30-11")
>end_date <- mdy("1-4-12")
#calculate how many days in this time interval
>n_days <- interval(start_date,end_date)/days(1)
>start_date + days(0:n_days)
[1]"2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04"
#convert to original format
format(start_date + days(0:n_days), format="%m-%d-%y")
[1] "12-30-11" "12-31-11" "01-01-12" "01-02-12" "01-03-12" "01-04-12"

Référence : Dates et heures en toute simplicité avec lubridate

11voto

Jeff Parker Points 411

2 implémentations similaires dans lubridate :

library(lubridate)

as_date(mdy("12-30-11"):mdy("1-4-12"))

# OR

seq(mdy("12-30-11"), mdy("1-4-12"), by = "days")

Les dates ne sont pas formatées en mois-jour-année, mais vous pouvez corriger le formatage si vous le souhaitez. Mais l'année-mois-jour est un peu plus facile à utiliser pour l'analyse.

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