2016-12-02 6 views
0

私は時刻情報を持つベクトルを1日に1回しか書かれていません。ベクトルをPOSIXltのような使用可能な形式に変換する必要があります。 1日以内のすべての時刻(%H:%M)が日付のない時間より前に記録された最後の日付に属している時刻が表示されます。日付への変換率についての質問に、複数の以前の回答から因子をPOSIXltに変換して日付を伝播させようR

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") 

(例えばhere)、私は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つの問題があります。 –

答えて

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

関連する問題