2016-10-30 8 views
2

複数の日付と時刻を解析する必要があります。助けのためのdplyrの日付時刻を解析する

call.times    time.1    time.2 date.called 
1  912 0000-02-28 09:12:00    <NA>  28-Feb 
2  1513 2016-10-01 15:13:00    <NA>  10/1/16 
3 922, 1810 2015-08-13 09:22:00 2015-08-13 18:10:00  8/13/15 

ありがとう:

call.times  time.1  time.2 date.called 
1  912 -62162174880  <NA>  28-Feb 
2  1513 1475334780  <NA>  10/1/16 
3 922, 1810 1439457720 1439489400  8/13/15 

代わりに、私はこの出力を生成しようとしている:

library(dplyr) 
library(tidyr) 
library(lubridate) 

date.called <- c("28-Feb","10/1/16","8/13/15") 
call.times <- c("912","1513","922, 1810") 
df<- data.frame(call.times,date.called,stringsAsFactors = F) 
df <- df %>% 
separate(call.times, c("time.1", "time.2"), sep = "\\,", remove=FALSE) %>% 
    mutate(time.1 = trimws(time.1), time.2 = trimws(time.2)) 
#parse each new date and time 
df %>% mutate(time.1 = ifelse(!is.na(time.1) , 
          parse_date_time(sprintf("%s %04s", date.called, 
          gsub('^([0-9]+)([0-9]{2})$', '\\1:\\2', time.1)), 
          c('%m/%d/%y %H:%M','%d-%b %H%M')), time.1), 
    time.2 = ifelse(!is.na(time.2) , 
          parse_date_time(sprintf("%s %04s", date.called, 
          gsub('^([0-9]+)([0-9]{2})$', '\\1:\\2', time.2)), 
          c('%m/%d/%y %H:%M','%d-%b %H%M')), time.2)) 

私はDFのために次のような出力が得られます。ここでは一例です。

+1

'、これあなたが数値の代わりに、日付で終わる(ifelse''?)の属性を取り除きifelse' 。だから、もしあなたがあなたのアプローチに固執したいなら、 'as.POSIXct(...、origin =" 1970-01-01 "、tz =" UTC ")'にそれをラップする必要があります.- – lukeA

答えて

3

LukeAがifelse属性を取り除き、したがって、日付の書式設定を削除し、コメントで言ったように私は

df %>% mutate_at(vars(starts_with("time")), function(x) 
    parse_date_time(
    sprintf("%s %04s", date.called, gsub('^([0-9]+)([0-9]{2})$', '\\1:\\2', x)), 
    c('%m/%d/%y %H:%M','%d-%b %H%M') 
)) 
# call.times    time.1    time.2 date.called 
# 1  912 0000-02-28 09:12:00    <NA>  28-Feb 
# 2  1513 2016-10-01 15:13:00    <NA>  10/1/16 
# 3 922, 1810 2015-08-13 09:22:00 2015-08-13 18:10:00  8/13/15 
+0

優秀!ありがとう、ルーク。それははるかにエレガントな解決策です。 – Eric

0

にしてください。 parse_date_time関数をifelseの外に移動することで、この動作を回避できます。あなたのコードの修正版は、あなたの希望する結果が得られます。

df %>% 
    mutate(time.1 = parse_date_time(ifelse(!is.na(time.2), 
             sprintf("%s %04s", date.called, gsub('^([0-9]+)([0-9]{2})$', '\\1:\\2', time.1)), 
             NA), 
            c('%m/%d/%y %H:%M','%d-%b %H%M')), 
     time.2 = parse_date_time(ifelse(!is.na(time.2), 
             sprintf("%s %04s", date.called, gsub('^([0-9]+)([0-9]{2})$', '\\1:\\2', time.2)), 
             NA), 
            c('%m/%d/%y %H:%M','%d-%b %H%M')) 
     ) 

結果:

call.times    time.1    time.2 date.called 
1  912 0000-02-28 09:12:00    <NA>  28-Feb 
2  1513 2016-10-01 15:13:00    <NA>  10/1/16 
3 922, 1810 2015-08-13 09:22:00 2015-08-13 18:10:00  8/13/15