2016-01-22 4 views
0

У меня есть вопрос о том, как изменить отметку времени в правильную дату в соответствии с разными столбцами после отметки времени. В этом примере (6columns):преобразование даты с R

+---------------------+---------+---------+-----------+-----------+------------+ 
|  TIMESTAMP  | DOY(1) | Hour(1) | Minute(1) | Second(1) | uSecond(1) | 
+---------------------+---------+---------+-----------+-----------+------------+ 
| 1990-01-01 00:00:00 |  76 |  17 |  35 |  26 |  200000 | 
| 1990-01-01 00:00:00 |  76 |  17 |  35 |  26 |  250000 | 
| 1990-01-01 00:00:00 |  76 |  17 |  35 |  26 |  300000 | 
+---------------------+---------+---------+-----------+-----------+------------+ 

Я хотел бы заменить метку времени и имеют:

+------------------------+---------+---------+-----------+-----------+------------+ 
|  TIMESTAMP  | DOY(1) | Hour(1) | Minute(1) | Second(1) | uSecond(1) | 
+------------------------+---------+---------+-----------+-----------+------------+ 
| 2005-03-17 17:35:26.20 |  76 |  17 |  35 |  26 |  200000 | 
| 2005-03-17 17:35:26.25 |  76 |  17 |  35 |  26 |  250000 | 
| 2005-03-17 17:35:26.30 |  76 |  17 |  35 |  26 |  300000 | 
+------------------------+---------+---------+-----------+-----------+------------+ 

(год доступен в имени файла (A20050761735.dat), и здесь DOY (1) = 76 соответствует 03/17 ...)

Очень важно, чтобы вторая была десятичной, и я вообще не знаю, как это сделать. Я пытался с «strptime», но я не думаю, что он разрешает секунда с десятичной запятой.

Любые предложения были бы в основном ориентировочными! Большое спасибо заранее

+1

Просьба представить минимальный воспроизводимый пример. См. [Как создать минимальный, завершенный и проверяемый пример] (http://stackoverflow.com/help/mcve). –

+0

Вы посмотрели на 'ISOdatetime()'? Они делали похожие вещи [здесь] (http://stackoverflow.com/questions/6915582/microsecond-time-stamps-in-r) – Badger

ответ

1

Попробуйте

df <- read.table(header=T, sep="|", check.names = F, text=" 
|  TIMESTAMP  | DOY(1) | Hour(1) | Minute(1) | Second(1) | uSecond(1) | 
| 1990-01-01 00:00:00 |  76 |  17 |  35 |  26 |  200000 | 
| 1990-01-01 00:00:00 |  76 |  17 |  35 |  26 |  250000 | 
| 1990-01-01 00:00:00 |  76 |  17 |  35 |  26 |  300000 |") 
df <- df[, -c(1, 8)] 
df[, 1] <- as.numeric(as.Date(df[, 1])+df[, 2]-1) 
options("digits.secs"=2) 
df[, 1] <- as.POSIXct(apply(df, 1, function(x) { sprintf("%s %s:%s:%s", as.Date(x[1], origin="1970-01-01"), x[3], x[4], x[5]+x[6]/1e6) })) 
df 
#    TIMESTAMP DOY(1) Hour(1) Minute(1) Second(1) uSecond(1) 
# 1 1990-03-17 17:35:26.20  76  17  35  26  200000 
# 2 1990-03-17 17:35:26.25  76  17  35  26  250000 
# 3 1990-03-17 17:35:26.29  76  17  35  26  300000 
Смежные вопросы