Как елегантно да преобразувам дата и час от десетична в %d.%m.%y %H:%M:%S?

Правя експеримент, който генерира автоматично регистрирани данни. Софтуерът създава клеймо за време във формат 41149.014850. Бих искал да преобразувам това десетично времево клеймо в 28.08.2012 00:21:23. Как мога да направя това в R най-елегантно?

Опитах се да използвам функцията strsplit и също функцията as.Date с указан произход, както и функцията times. Но без резултат. Имам проблеми с разделянето на клеймото за време на две числа, до които имам достъп с функциите as.Date и times.

Ето малко демо код:

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

Моля, уведомете ме, ако имате нужда от повече информация за предизвикателството или ако мога да задам въпроса по по-добър начин. Всяко търсене беше безрезултатно.

Директната помощ или връзката към други уебсайтове/публикации се оценява високо.


person Strohmi    schedule 28.08.2012    source източник


Отговори (2)


Вашите дати са във формат за дата, подобен на Excel (дни след 1 януари 1900 г.), така че трябва да ги конвертирате във формат за дата R. След това можете да го конвертирате във формат за дата и час (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"
person Joshua Ulrich    schedule 28.08.2012

Това се доближава: Числата показват броя секунди от дата, близка до 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"

Там все още има отместване на часовата зона.

person Andrie    schedule 28.08.2012