2012-08-28 13 views
6

Wykonuję eksperyment, który automatycznie generuje dane. Oprogramowanie generuje znacznik czasu w formacie 41149.014850. Chciałbym przekonwertować ten dziesiętny sygnaturę czasową na 28.08.2012 00:21:23. Jak mogę to zrobić w R najbardziej elegancko?Jak elegancko przekonwertować datetime z dziesiętnego na "% d.% M.% Y% H:% M:% S"?

Próbowałem użyć funkcji strsplit, a także funkcji as.Date o określonym początku, a także funkcji times. Ale bez skutku. Mam problem z dzieleniem znacznika czasu na dwie liczby, do których mogę uzyskać dostęp za pomocą funkcji.

Oto kod demo:

myDatetime <- c(41149.004641, # 28.08.2012 00:06:41 
41149.009745, # 28.08.2012 00:14:02 
41149.014850, # 28.08.2012 00:21:23 
41149.019954) # 28.08.2012 00:28:44 

## not working out for me 
Dat.char <- as.character(myDatetime) 
date.split <- strsplit(Dat.char, split = "\\.") 
## how to proceed from here, if it is a good way at all 

Proszę dać mi znać, jeśli potrzebujesz więcej informacji o wyzwaniu czy mogę postawić pytanie w lepszy sposób. Wszelkie poszukiwania nie przyniosły skutku.

Bezpośrednia pomoc lub powiązanie z innymi stronami/postami jest bardzo doceniane.

Odpowiedz

9

Daty są w formacie daty podobnym do Excela (dni od 1 stycznia 1900), więc musisz przekonwertować je na format daty R. Następnie możesz przekonwertować go na format datetime (POSIXct).

# first convert to R Date 
datetime <- as.Date(myDatetime-1, origin="1899-12-31") 
# now convert to POSIXct 
(posixct <- .POSIXct(unclass(datetime)*86400, tz="GMT")) 
# [1] "2012-08-28 00:06:40 GMT" "2012-08-28 00:14:01 GMT" 
# [3] "2012-08-28 00:21:23 GMT" "2012-08-28 00:28:44 GMT" 
# times are sometimes off by 1 second, add more digits to seconds to see why 
options(digits.secs=6) 
posixct 
# [1] "2012-08-28 00:06:40.9823 GMT" "2012-08-28 00:14:01.9680 GMT" 
# [3] "2012-08-28 00:21:23.0399 GMT" "2012-08-28 00:28:44.0256 GMT" 
# round to nearest second 
(posixct <- round(posixct, "sec")) 
# [1] "2012-08-28 00:06:41 GMT" "2012-08-28 00:14:02 GMT" 
# [3] "2012-08-28 00:21:23 GMT" "2012-08-28 00:28:44 GMT" 
# now you can convert to your desired format 
format(posixct, "%d.%m.%Y %H:%M:%S") 
# [1] "28.08.2012 00:06:41" "28.08.2012 00:14:02" 
# [3] "28.08.2012 00:21:23" "28.08.2012 00:28:44" 
2

dostaje to blisko: Cyfry oznaczają liczbę sekund od daty blisko 1/1/1900:

as.POSIXct(x*3600*24, origin=as.Date("1900-01-01")-2, tz="UTC") 
[1] "2012-08-28 01:06:40 BST" "2012-08-28 01:14:01 BST" "2012-08-28 01:21:23 BST" 
[4] "2012-08-28 01:28:44 BST" 

Nadal jest tam strefy czasowej.

Powiązane problemy