2 votes

Converting yearmon column to last date of the month in R

J'ai un dataframe (df) comme suit :

Date        Arrivées

2014-07      100
2014-08      150
2014-09      200

Je sais que je peux convertir les dates yearmon au premier jour de chaque mois comme suit :

df$Date <- as.POSIXct(paste0(as.character(df[,1]),"-01"), format = "%Y-%m-%d")

Cependant, étant donné que mes données ne sont pas disponibles avant la fin du mois, je veux les indexer à la fin plutôt qu'au début, et je n'arrive pas à le comprendre. Toute aide est appréciée.

9voto

Gavin Simpson Points 72349

Si la variable Date est un véritable vecteur de classe yearmon, issu du package zoo, la méthode as.Date.yearmon peut faire ce que vous voulez via son argument frac.

En utilisant vos données, en supposant que la variable Date était initialement un vecteur de caractères

library("zoo")
df <- data.frame(Date = c("2014-07", "2014-08", "2014-09"),
                 Arrivals = c(100, 150, 200))

Je convertis ceci en un vecteur de classe yearmon:

df <- transform(df, Date2 = as.yearmon(Date))

En supposant que c'est ce que vous avez, alors vous pouvez obtenir ce que vous voulez en utilisant as.Date() avec frac = 1:

df <- transform(df, Date3 = as.Date(Date2, frac = 1))

ce qui donne:

> df
     Date Arrivals    Date2      Date3
1 2014-07      100 Jul 2014 2014-07-31
2 2014-08      150 Aug 2014 2014-08-31
3 2014-09      200 Sep 2014 2014-09-30

Cela montre les différentes étapes. Si vous ne voulez que la Date finale, c'est une seule ligne

## en supposant que `Date` est un objet `yearmon`
df <- transform(df, Date = as.Date(Date, frac = 1))
## ou si ce n'est pas un `yearmon`
df <- transform(df, Date = as.Date(as.yearmon(Date), frac = 1))

L'argument frac est la fraction du mois à attribuer aux dates résultantes lors de la conversion d'objets de type yearmon en objets de type Date. Ainsi, pour obtenir le premier jour du mois, plutôt que de convertir en caractère et de coller "-01" comme le montrait votre question, il est préférable de convertir en objet Date avec frac = 0.

Si la variable Date dans votre df n'est pas un objet de classe yearmon, alors vous pouvez résoudre votre problème en le convertissant en un objet de cette classe et en utilisant la méthode as.Date() comme décrit ci-dessus.

4voto

Voici une façon de le faire en utilisant le package zoo.

Code R:

library(zoo)
df
#      Date Arrivals
# 1 2014-07      100
# 2 2014-08      150
# 3 2014-09      200

df$Date <- as.Date(as.yearmon(df$Date), frac = 1)

# output
#         Date Arrivals
# 1 2014-07-31      100
# 2 2014-08-31      150
# 3 2014-09-30      200

3voto

alistaire Points 5898

En utilisant lubridate, vous pouvez ajouter un mois et soustraire un jour pour obtenir le dernier jour du mois :

library(lubridate)

ymd(paste0(df$Date, '-01')) + months(1) - days(1)
# [1] "2014-07-31" "2014-08-31" "2014-09-30"

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