J'ai quelques données très simples dans R qui doivent changer de format de date:
date midpoint
1 31/08/2011 0.8378
2 31/07/2011 0.8457
3 30/06/2011 0.8147
4 31/05/2011 0.7970
5 30/04/2011 0.7877
6 31/03/2011 0.7411
7 28/02/2011 0.7624
8 31/01/2011 0.7665
9 31/12/2010 0.7500
10 30/11/2010 0.7734
11 31/10/2010 0.7511
12 30/09/2010 0.7263
13 31/08/2010 0.7158
14 31/07/2010 0.7110
15 30/06/2010 0.6921
16 31/05/2010 0.7005
17 30/04/2010 0.7113
18 31/03/2010 0.7027
19 28/02/2010 0.6973
20 31/01/2010 0.7260
21 31/12/2009 0.7154
22 30/11/2009 0.7287
23 31/10/2009 0.7375
Plutôt que %d/%m/%Y
, Je le voudrais au format R standard de %Y-%m-%d
Comment puis-je faire ce changement? J'ai essayé:
nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")
Mais cela a juste coupé l'année et ajouté des zéros à la journée:
[1] "0031/08/20" "0031/07/20" "0030/06/20" "0031/05/20" "0030/04/20"
[6] "0031/03/20" "0028/02/20" "0031/01/20" "0031/12/20" "0030/11/20"
[11] "0031/10/20" "0030/09/20" "0031/08/20" "0031/07/20" "0030/06/20"
[16] "0031/05/20" "0030/04/20" "0031/03/20" "0028/02/20" "0031/01/20"
[21] "0031/12/20" "0030/11/20" "0031/10/20" "0030/09/20" "0031/08/20"
[26] "0031/07/20" "0030/06/20" "0031/05/20" "0030/04/20" "0031/03/20"
[31] "0028/02/20" "0031/01/20" "0031/12/20" "0030/11/20" "0031/10/20"
[36] "0030/09/20" "0031/08/20" "0031/07/20" "0030/06/20" "0031/05/20"
Merci!
Il y a deux étapes ici:
X$newdate <- strptime(as.character(X$date), "%d/%m/%Y")
La colonne newdate
doit maintenant être de type Date
.
format()
ou strftime()
:format(X$newdate, "%Y-%m-%d")
Un exemple plus complet:
R> nzd <- data.frame(date=c("31/08/2011", "31/07/2011", "30/06/2011"),
+ mid=c(0.8378,0.8457,0.8147))
R> nzd
date mid
1 31/08/2011 0.8378
2 31/07/2011 0.8457
3 30/06/2011 0.8147
R> nzd$newdate <- strptime(as.character(nzd$date), "%d/%m/%Y")
R> nzd$txtdate <- format(nzd$newdate, "%Y-%m-%d")
R> nzd
date mid newdate txtdate
1 31/08/2011 0.8378 2011-08-31 2011-08-31
2 31/07/2011 0.8457 2011-07-31 2011-07-31
3 30/06/2011 0.8147 2011-06-30 2011-06-30
R>
La différence entre les colonnes trois et quatre est le type: newdate
est de classe Date
tandis que txtdate
est caractère.
nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")
Dans le code ci-dessus, il y a deux erreurs. Tout d'abord, lorsque vous lisez nzd$date
à l'intérieur as.Date
vous ne mentionnez pas dans quel format vous l'alimentez date
. Donc, il essaie son format par défaut pour le lire. Si vous voyez le document help
, ?as.Date
tu verras
format
Une chaîne de caractères. S'il n'est pas spécifié, il essaiera "% Y-% m-% d" puis "% Y /% m /% d" sur le premier élément non NA et donnera une erreur si aucun des deux ne fonctionne. Sinon, le traitement se fait via strptime
La deuxième erreur est: même si vous souhaitez le lire en %Y-%m-%d
format, dans format
vous avez écrit "%Y/%m/%d"
.
Maintenant, la bonne façon de procéder est:
> nzd <- data.frame(date=c("31/08/2011", "31/07/2011", "30/06/2011"),
+ mid=c(0.8378,0.8457,0.8147))
> nzd
date mid
1 31/08/2011 0.8378
2 31/07/2011 0.8457
3 30/06/2011 0.8147
> nzd$date <- format(as.Date(nzd$date, format = "%d/%m/%Y"), "%Y-%m-%d")
> head(nzd)
date mid
1 2011-08-31 0.8378
2 2011-07-31 0.8457
3 2011-06-30 0.8147
Vous pouvez également utiliser le parse_date_time
fonction du package lubridate
:
library(lubridate)
day<-"31/08/2011"
as.Date(parse_date_time(day,"dmy"))
[1] "2011-08-31"
parse_date_time
renvoie un objet POSIXct, nous utilisons donc as.Date
pour obtenir un objet date. Le premier argument de parse_date_time
spécifie un vecteur de date, le deuxième argument spécifie l'ordre dans lequel votre format se produit. L'argument orders
fait parse_date_time
très souple.
Après avoir lu vos données via un textConnection
, ce qui suit semble fonctionner:
dat <- read.table(textConnection(txt), header = TRUE)
dat$date <- strptime(dat$date, format= "%d/%m/%Y")
format(dat$date, format="%Y-%m-%d")
> format(dat$date, format="%Y-%m-%d")
[1] "2011-08-31" "2011-07-31" "2011-06-30" "2011-05-31" "2011-04-30" "2011-03-31"
[7] "2011-02-28" "2011-01-31" "2010-12-31" "2010-11-30" "2010-10-31" "2010-09-30"
[13] "2010-08-31" "2010-07-31" "2010-06-30" "2010-05-31" "2010-04-30" "2010-03-31"
[19] "2010-02-28" "2010-01-31" "2009-12-31" "2009-11-30" "2009-10-31"
> str(dat)
'data.frame': 23 obs. of 2 variables:
$ date : POSIXlt, format: "2011-08-31" "2011-07-31" "2011-06-30" ...
$ midpoint: num 0.838 0.846 0.815 0.797 0.788 ...
En utilisant une ligne pour convertir les dates au format préféré:
nzd$date <- format(as.Date(nzd$date, format="%d/%m/%Y"),"%Y/%m/%d")
C'est vraiment facile en utilisant le paquet lubridate. Tout ce que vous avez à faire est de dire à R dans quel format votre date est déjà. Il la convertit ensuite au format standard
nzd$date <- dmy(nzd$date)
c'est ça.
Je crois que
nzd$date <- as.Date(nzd$date, format = "%d/%m/%Y")
est suffisant.