Conversion du numéro de série excel DateTime en R DateTime
Lorsque les tables excel sont importées en tant que points xy dans ArcGIS, je continue à perdre mon horodatage correct pour chaque point. Ainsi, j'ai formaté le numéro de série DateTime, créé le .shp, et lire la .shp dans R en utilisant readOGR ().
Une fois dans R, je peux convertir à la date correcte en utilisant as.Date()
et l'argument origin = "1899-12-30"
, mais le temps est laissé de côté. Bien que j'ai vu des exemples avec une seule Date, je n'ai pas vu d'exemples travaillés avec DateTime. J'ai utilisé as.Date()
ainsi que as.POSIXct()
mais ceci tâche apparemment simple comme été un peu frustrant, donc le poste ...
J'ai créé un exemple de jeu de données avec 10 lignes du format DateTime correct ainsi que le numéro de série excel.
*Merci Richard et thelatemail pour leur oeil vif sur un obstacle plus tôt. J'ai corrigé les données et re-posté ici.
Voici mes exemples de données
helpData <- structure(list(ID = 1:10, DateTime = structure(c(9L, 1L, 2L,
3L, 4L, 5L, 6L, 7L, 8L, 8L), .Label = c("3/11/2011 7:55", "3/13/2011 7:55",
"3/14/2011 0:00", "3/14/2011 10:04", "3/14/2011 7:55", "3/15/2011 19:55",
"3/17/2011 7:55", "3/18/2011 4:04", "3/4/2011 6:00"), class = "factor"),
ExcelNum = c(40606.25, 40613.32986, 40615.32986, 40616, 40616.41944,
40616.32986, 40617.82986, 40619.32986, 40620.16944, 40620.16944
)), .Names = c("ID", "DateTime", "ExcelNum"), class = "data.frame", row.names = c(NA,
-10L))
head(helpData)
Le DateTime est GMT. L'heure est une horloge de 24 heures (c'est-à-dire pas AM/PM). Je travaille sur Windows 7, ai le plus récent R, et ArcGIS 10.
Le code ci-dessous obtient la Date correcte, mais l'heure est toujours manquante.
newDateTime <- as.Date(helpData[ , "ExcelNum"], origin = "1899-12-30")
head(newDateTime)
Merci d'avance!
4 réponses
Votre numéro compte les jours. Convertir en secondes, et vous êtes tous ensemble (moins une erreur d'arrondi)
helpData[["ExcelDate"]] <-
as.POSIXct(helpData[["ExcelNum"]] * (60*60*24)
, origin="1899-12-30"
, tz="GMT")
# ID DateTime ExcelNum ExcelDate
# 1 1 3/4/2011 6:00 40606.25 2011-03-04 06:00:00
# 2 2 3/11/2011 7:55 40613.33 2011-03-11 07:54:59
# 3 3 3/13/2011 7:55 40615.33 2011-03-13 07:54:59
# 4 4 3/14/2011 0:00 40616.00 2011-03-14 00:00:00
# 5 5 3/14/2011 10:04 40616.42 2011-03-14 10:03:59
# 6 6 3/14/2011 7:55 40616.33 2011-03-14 07:54:59
# 7 7 3/15/2011 19:55 40617.83 2011-03-15 19:54:59
# 8 8 3/17/2011 7:55 40619.33 2011-03-17 07:54:59
# 9 9 3/18/2011 4:04 40620.17 2011-03-18 04:03:59
# 10 10 3/18/2011 4:04 40620.17 2011-03-18 04:03:59
Les données temporelles sont toujours là, elles ne sont tout simplement pas affichées-voir:
as.numeric(newDateTime)
#[1] 15037.25 15044.33 15046.33 15047.00 etc etc
Si vous souhaitez travailler avec des parties de jours, il est probablement préférable d'utiliser les représentations POSIXct
. Pour ce faire, vous pouvez convertir en Date
, puis convertir en POSIXct
, bien que cela mette en jeu des problèmes de fuseau horaire si vous voulez faire une comparaison directe avec votre colonne DateTime
.
helpData$newDate <- as.POSIXct(as.Date(helpData$ExcelNum,origin="1899-12-30"))
attr(helpData$newDate,"tzone") <- "UTC"
helpData
# ID DateTime ExcelNum newDate
#1 1 3/4/2011 6:00 40606.25 2011-03-04 06:00:00
#2 2 3/11/2011 7:55 40613.33 2011-03-11 07:54:59
#3 3 3/13/2011 7:55 40615.33 2011-03-13 07:54:59
#4 4 3/14/2011 0:00 40616.00 2011-03-14 00:00:00
#5 5 3/14/2011 10:04 40616.42 2011-03-14 10:03:59
#6 6 3/14/2011 7:55 40616.33 2011-03-14 07:54:59
#7 7 3/15/2011 19:55 40617.83 2011-03-15 19:54:59
#8 8 3/17/2011 7:55 40619.33 2011-03-17 07:54:59
#9 9 3/18/2011 4:04 40620.17 2011-03-18 04:03:59
#10 10 3/18/2011 4:04 40620.17 2011-03-18 04:03:59
Voici une autre façon de le faire en utilisant les paquets janitor et tibble:
install.packages("janitor")
install.packages("tibble")
library(tibble)
library(janitor)
excel_numeric_to_date(as.numeric(as.character(helpData$ExcelNum), date_system = "modern")
Utilisez la fonction convertToDateTime
. Il est simple. Voici un exemple:
library(openxlsx)
convertToDateTime(helpData$ExcelNum, origin = "1900-01-01")
Faites-moi savoir comment cela fonctionne.