2016-12-02 17 views
0

시간 정보가 있고 날짜가 하루에 한 번만있는 벡터가 있습니다. 벡터를 POSIXlt과 같은 사용 가능한 형식으로 변환해야합니다. 날짜는 시간 순서대로 지정되며, 하루 중 모든 시간 (%H:%M)은 날짜가없는 시간 전에 기록 된 마지막 날짜에 속합니다.날짜를 전파하는 요소를 POSIXlt로 변환 R

날짜 변환 (예를 들어, here)에 요인에 대한 질문에 대한 다수의 이전 답변에서
t <- structure(c(6L, 1L, 2L, 3L, 4L, 5L, 10L, 7L, 8L, 9L), 
    .Label = c("00:15", "00:25", "00:35", "00:45", "02:05", "20.01.2013; 0:05", 
    "20:48", "20:58", "21:08", "25.01.2013; 20:38"), class = "factor") 

, 나는 t[c(1, 7)]을 변환하는 방법을 알고있다.

t1 <- strptime(as.character(t[c(1, 7)]), format = "%d.%m.%Y; %H:%M") 
# t1 
# [1] "2013-01-20 00:05:00 CET" "2013-01-25 20:38:00 CET" 

그러나 올바르게 변환 할 수 있도록 나머지 값의 누락 날짜를 전파하려면 어떻게해야합니까?

+0

는이 날짜가 하루 차이가 있습니다 사용하고 계십니까? – akrun

+0

@akrun 대체로 그래,하지만 항상 그런 것은 아닙니다. – nya

+1

여기에는 실제로 데이터를 재 형성하고 datetime을 파싱하는 두 가지 문제가 있습니다. –

답변

2
library(zoo) # For the na.locf function 

df = data.frame(date=t) 

# Put date and time in separate columns 
df$time = gsub(".*; (.*)","\\1", df$date) 
df$date = as.Date(df$date, format="%d.%m.%Y") 

# Fill missing df$date values 
df$date = na.locf(df$date) 

# Convert to POSIXct 
df$date = as.POSIXct(paste(df$date, df$time)) 
df = df[,1, drop=FALSE] 

df 

        date 
1 2013-01-20 00:05:00 
2 2013-01-20 00:15:00 
3 2013-01-20 00:25:00 
4 2013-01-20 00:35:00 
5 2013-01-20 00:45:00 
6 2013-01-20 02:05:00 
7 2013-01-25 20:38:00 
8 2013-01-25 20:48:00 
9 2013-01-25 20:58:00 
10 2013-01-25 21:08:00 
+0

니스. '='대신'<-'를 사용 하겠지만 그것은 저만의 것입니다. –

+0

감사합니다. @DirkEddelbuettel. 나는 그 모든 여분의 타이핑을하기에는 너무 게으른 것 같아. :). – eipi10

1

우리는 사용할 수 dplyr

library(dplyr) 
data.frame(t) %>% 
    mutate(Date = as.Date(t, "%d.%m.%Y")) %>% 
    group_by(grp = cumsum(!is.na(Date))) %>% 
    mutate(Date = Date[1L], 
      DateTime = as.POSIXct(paste(Date, sub(".*;", "", t)))) %>% 
    ungroup() %>% 
    select(DateTime) 
#   DateTime 
#    <dttm> 
#1 2013-01-20 00:05:00 
#2 2013-01-20 00:15:00 
#3 2013-01-20 00:25:00 
#4 2013-01-20 00:35:00 
#5 2013-01-20 00:45:00 
#6 2013-01-20 02:05:00 
#7 2013-01-25 20:38:00 
#8 2013-01-25 20:48:00 
#9 2013-01-25 20:58:00 
#10 2013-01-25 21:08:00 

또는 base R

i1 <- nchar(as.character(t))==5 
v1 <- ifelse(i1, paste(sub(";.*", ";", t[!i1])[cumsum(!i1)], 
        sub(".*;\\s+", "", t[i1])), as.character(t)) 

strptime(v1, "%d.%m.%Y %H:%M") 
+0

아쉽게도 코드가 각 행에 날짜를 추가했습니다. 나는 하나의 날짜에 속하는 가변 수의 행을 가지고있다. – nya

+0

@nya 문제를 반영하는 더 좋은 예를 게시 할 수 있습니까? – akrun

+0

두 가지 대답이 모두 효과가 있지만 이해하기가 쉽기 때문에 eipi10을 수락합니다. 대안을 가져 주셔서 감사합니다. – nya