web-dev-qa-db-fra.com

Modification du format de date dans R

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!

19
A.Krueger

Il y a deux étapes ici:

  • Analyser les données. Votre exemple n'est pas entièrement reproductible, les données dans un fichier ou la variable dans un texte ou une variable factorielle? Supposons ce dernier, puis si votre data.frame s'appelle X, vous pouvez le faire
 X$newdate <- strptime(as.character(X$date), "%d/%m/%Y")

La colonne newdate doit maintenant être de type Date.

  • Formatez les données. Il s'agit d'appeler 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.

43
Dirk Eddelbuettel
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
7
hi15

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.

5
Ben Rollert

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 ...
3
Chase

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")
1
user8217374

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.

1
user2678319

Je crois que

nzd$date <- as.Date(nzd$date, format = "%d/%m/%Y")

est suffisant.

0
joran