2012-07-30 5 views
-2

J'ai un format de date comme suit:Comment changer le format de date dans la R

 V1 V2 V3 
1 20100420 915 120 
2 20100420 920 150 
3 20100420 925 270 
4 20100420 1530 281 

3 colonnes par ligne, les moyens ligne 1ème: 2010-04-20 09:15 120

maintenant Je souhaite modifier à 1 colonne (séries chronologiques):

    V3 
1 20100420 09:15 120 
2 20100420 09:20 150 
3 20100420 09:25 270 
4 20100420 15:30 281 

ou:

    V3 
1 20100420 9:15 120 
2 20100420 9:20 150 
3 20100420 9:25 270 
4 20100420 15:30 281 

Comment pourrais-je l'obtenir en R?

+0

Qu'avez-vous essayé? Ceci est assez bien documenté dans les documents R et dans différentes questions sur SO. – A5C1D2H2I1M1N2O1R2T1

+0

Pour plus de clarté, dans les données d'origine, qu'est-ce que "V3"? – A5C1D2H2I1M1N2O1R2T1

+0

il peut y avoir quelques données de stocks, les deux premières colonnes sont la date, les dernières colonnes peuvent être 'open.price',' close.price', 'volumn', ect. – PepsiCo

Répondre

5

?strptime et ?sprintf sont vos amis:

Recréez l'ensemble de données:

test <- read.table(textConnection("V1 V2 V3 
20100420 915 120 
20100420 920 150 
20100420 925 270"),header=TRUE) 

Est-ce une empâtage:

strptime(
paste(
    test$V1, 
    sprintf("%04d", test$V2), 
    sep="" 
), 
format="%Y%m%d%H%M" 
) 

Résultat:

[1] "2010-04-20 09:15:00" "2010-04-20 09:20:00" "2010-04-20 09:25:00" 
+0

Merci, la fonction 'strptime' est vraiment utile! J'ai affaire à des données de séries temporelles la première fois, ça a l'air compliqué. – PepsiCo

+0

@thelatemail, tout ce matériel n'est pas vraiment nécessaire, n'est-ce pas? Tant que la longueur de la chaîne de caractères finale est correcte, 'strptime' devrait être capable d'analyser la date, sans devoir avoir des tirets imbriqués dans la chaîne. – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab - ouais, vous avez raison. Quand je n'essaie plus de taper sur un téléphone, je vais le réparer jusqu'à la référence test $ V1 au lieu des sous-chaînes. – thelatemail

3

D'abord, fixer la mise en forme et d'utiliser un paquet comme xts pour obtenir un objet de séries temporelles:

# Read in the data. In the future, use `dput` or something else 
# so that others can read in the data in a more convenient way 
temp = read.table(header=TRUE, text=" V1 V2 V3 
1 20100420 915 120 
2 20100420 920 150 
3 20100420 925 270 
4 20100420 1530 281") 

# Get your date object and format it to a date/time object 
date = paste0(temp[[1]], apply(temp[2], 1, function(x) sprintf("%04.f", x))) 
date = strptime(date, format="%Y%m%d%H%M") 

# Extract just the values 
values = temp[[3]] 

# Load the xts package and convert your dataset 
require(xts) 
xts(values, order.by=date) 
#      [,1] 
# 2010-04-20 09:15:00 120 
# 2010-04-20 09:20:00 150 
# 2010-04-20 09:25:00 270 
# 2010-04-20 15:30:00 281 

Dans la conversion date:

  • apply(temp[2], 1, ...) va ligne par ligne pour la deuxième colonne de température et reformate le nombre à quatre chiffres. Puis, paste0 combine toutes les informations de date-heure à un seul vecteur.
  • Enfin, strptime convertit ce vecteur de caractères en un objet date-heure approprié.

Mise à jour

Bien sûr, si vous voulez juste un data.frame normal, vous pouvez le faire aussi, mais je recommande fortement d'utiliser quelque chose comme zoo ou xts si vous voulez faire l'analyse des séries en temps réel. Voici l'étape simple data.frame (après avoir créé les objets date et values plus tôt).

data.frame(V3 = values, row.names=date) 
#      V3 
# 2010-04-20 09:15:00 120 
# 2010-04-20 09:20:00 150 
# 2010-04-20 09:25:00 270 
# 2010-04-20 15:30:00 281 
+0

Merci! Je dois y passer plus de temps. – PepsiCo

+0

Maintenant pour le moment "DUH" qui vient après l'affichage ... Simplifiez à une ligne. Pour 'xts':' xts (temp $ V3, order.by = strptime (coller0 (temp [[1]], sprintf ("% 04.f", temp [[2]])), format = "% Y % m% d% H% M "))' et pour un 'data.frame':' data.frame (V3 = temp $ V3, row.names = strptime (paste0 (temp [[1]], sprintf (" % 04.f ", temp [[2]])), format ="% Y% m% d% H% M "))'. – A5C1D2H2I1M1N2O1R2T1

Questions connexes