web-dev-qa-db-fra.com

R - Conversion des champs de date et d'heure en POSIXct au format HHMMSS

J'ai un fichier de données qui a trois colonnes ainsi:

20010101 000000  0.833
20010101 000500  0.814
20010101 001000  0.794
20010101 001500  0.772
...

Comme il est assez clair aux yeux de l'homme, les deux premiers sont la date et l'heure. Je dois les convertir en POSIXct (ou autre chose si c'est mieux, mais mon expérience passée limitée en matière de gestion des horodatages dans R est d'utiliser POSIXct). Normalement, après l'avoir inséré avec read.table, j'utiliserais:

df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S")

Cependant, la deuxième colonne semble perdre ses zéros de tête (probablement via une contrainte de type?) Et ne fonctionne donc pas correctement.

J'ai examiné Combiner la date sous forme de nombre entier et d'heure en tant que facteur pour POSIXct dans R et Conversion de deux colonnes de données de date et d'heure en une , mais les deux utilisent des temps avec des délimiteurs tels que: ne pas avoir le même problème.

Comment puis-je convertir ces colonnes en POSIXct, s'il vous plaît?

12
Flyto

Tu étais très proche. Ce qui suit "simplement" oblige les deux premières colonnes à être lues en tant que chaînes de caractères, ce qui enregistre les zéros au début.

R> df <- read.table(text="20010101 000000  0.833
20010101 000500  0.814
20010101 001000  0.794
20010101 001500  0.772", 
+ header=FALSE, colClasses=c("character", "character", "numeric"), 
+ col.names=c("Date", "Time", "Val"))
R> df
      Date   Time   Val
1 20010101 000000 0.833
2 20010101 000500 0.814
3 20010101 001000 0.794
4 20010101 001500 0.772

Maintenant, ce que vous tentiez de faire "marche bien":

R> df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S")
R> df
      Date   Time   Val            DateTime
1 20010101 000000 0.833 2001-01-01 00:00:00
2 20010101 000500 0.814 2001-01-01 00:05:00
3 20010101 001000 0.794 2001-01-01 00:10:00
4 20010101 001500 0.772 2001-01-01 00:15:00
R> 
16
Dirk Eddelbuettel

Il vous suffit d'importer les données en tant que caractère:

txt <- "Date  Time  value
20010101 000000  0.833
20010101 000500  0.814
20010101 001000  0.794
20010101 001500  0.772
"

df <- read.table(text=txt, header=TRUE, 
                 colClasses=c("character", "character", "numeric"))

df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S")
3
zelite

Simplement vous pouvez utiliser le paquet lubrifiant qui est super génial et rapide. pour votre but essayez ceci:

df <- read.table(text="20010101 000000  0.833
20010101 000500  0.814
20010101 001000  0.794
20010101 001500  0.772", 
                  header=FALSE, colClasses=c("character", "character",     "numeric"), 
                  col.names=c("Date", "Time", "Val"))

df$mix <- paste(df$Date, df$Time)
df$mix <- parse_date_time(df$mix, 'Ymd HMS')

Il vous suffit simplement d’alimenter le bon format. Je le préfère à as.POSICct car il est beaucoup plus flexible et que vous avez d’autres fonctions pour travailler avec des variables de temps. 

1
Miros