2017-01-27 11 views
0

私は2つの列を持つdata.frameを持っています。両方の日付は文字:rでの複雑な日付操作

a <- c("01-01-2007 00:00:00", "01-02-2007 00:00:00", "03-05-2007 00:00:00", "31-08-2007 00:00:00") 
b <- c("01-01-1960 01:25:30", "01-01-1960 1:05:36", "01-01-1960 02:25:59", "01-01-1960 1:20:30") 
df <- as.data.frame(cbind(a,b)) 
df 
        a     b 
1 01-01-2007 00:00:00 01-01-1960 01:25:30 
2 01-02-2007 00:00:00 01-01-1960 1:05:36 
3 03-05-2007 00:00:00 01-01-1960 02:25:59 
4 31-08-2007 00:00:00 01-01-1960 1:20:30 

最初の列には必要な日付がありますが、時刻が間違っています。 2番目の列の時刻は正しいですが、日付は正しくありません。 2番目の列には、いくつかの行の時間に1桁しかないという問題もあります。

私が必要とするのは、時間による頻度を表すために使用できる時間形式の2つの列間のマージです。

私は両方の列をマージするためにさまざまな組み合わせを試しましたが、いつもエラーが発生します。 as.Date()私は時間をとらないので、as.POSIXctをdata.frameに適用することはできません。

私はいくつかの助けに感謝します。

おかげ

答えて

2

一緒に正しい部品を得るためにregexを使用した(単に前提としてい中央のスペース):

df$good_string = paste(gsub(pattern = " .*", "", x = df$a), gsub(pattern = ".* ", "", df$b), sep = " ") 
df$parsed_date = as.POSIXct(df$good_string, format = "%d-%m-%Y %H:%M:%S") 
df[3:4] 
#   good_string   parsed_date 
# 1 01-01-2007 01:25:30 2007-01-01 01:25:30 
# 2 01-02-2007 1:05:36 2007-02-01 01:05:36 
# 3 03-05-2007 02:25:59 2007-05-03 02:25:59 
# 4 31-08-2007 1:20:30 2007-08-31 01:20:30 
+0

これは完全に機能します。 – Xbel

0

lubridateパッケージを使用してみてください:

library(lubridate) 

a <- c("01-01-2007 00:00:00", "01-02-2007 00:00:00", "03-05-2007 00:00:00", "31-08-2007 00:00:00") 
b <- c("01-01-1960 01:25:30", "01-01-1960 1:05:36", "01-01-1960 02:25:59", "01-01-1960 1:20:30") 
df <- as.data.frame(cbind(a,b)) 
df 

hr <- hour(parse_date_time(b, "dmy HMS")) 
minu <- minute(parse_date_time(b, "dmy HMS")) 
sec<- second(parse_date_time(b, "dmy HMS")) 

getDate <- as_date(parse_date_time(a, "dmy HMS")) 
getTime <- paste(hr, minu, sec, sep = ":") 

as_datetime(paste(getDate, getTime)) 
1

基本機能を使用して、我々はこれを行うことができます:

a = as.POSIXct(a, '%d-%m-%Y %H:%M:%S', tz = "GMT") 
b = as.POSIXct(b, '%d-%m-%Y %H:%M:%S', tz = "GMT") 
df <- data.frame(a,b) 
df$merged = paste(strftime(df$a, '%d-%m-%Y', tz = "GMT"), strftime(df$b, '%H:%M:%S', tz = "GMT")) 
df 

# 
#   a     b    merged 
# 1 2007-01-01 1960-01-01 01:25:30 01-01-2007 01:25:30 
# 2 2007-02-01 1960-01-01 01:05:36 01-02-2007 01:05:36 
# 3 2007-05-03 1960-01-01 02:25:59 03-05-2007 02:25:59 
# 4 2007-08-31 1960-01-01 01:20:30 31-08-2007 01:20:30