在R中的不同数据帧列中分割日期和时间

时间:2017-06-02 04:23:16

标签: r

我在R

中有以下数据框
ID       Date1              Date2       

1        21-03-16 8:36      22-03-16 12:36
1        23-03-16 9:36      24-03-16 01:36
1        22-03-16 10:36     25-03-16 11:46
1        23-03-16 11:36     28-03-16 10:16

我想要的数据框是

ID    Date1        Date1_time    Date2          Date2_time
1     2016-03-21   08:36:00      2016-03-22     12:36:00
1     2016-03-23   09:36:00      2016-03-24     01:36:00
1     2016-03-22   10:36:00      2016-03-25     11:46:00
1     2016-03-23   11:36:00      2016-03-28     10:16:00

我可以使用strptime单独执行此操作,如下所示

df$Date1 <- strptime(df$Date1, format='%d-%m-%y %H:%M')
df$Date1_time <-  strftime(df$Date1 ,format="%H:%M:%S")
df$Date1 <- strptime(df$Date1, format='%Y-%m-%d')

但是,我有很多日期列要像上面那样进行转换。如何在R中编写函数来执行此操作。

3 个答案:

答案 0 :(得分:1)

您可以使用dplyr::mutate_at执行此操作以对多列进行操作。有关有效指定要操作的列的详细信息,请参阅select helpers

然后,您可以使用lubridatehms作为日期和时间函数。

library(dplyr)
library(lubridate)
library(hms)


df <- readr::read_csv(
'ID,Date1,Date2
1,"21-03-16 8:36","22-03-16 12:36"
1,"23-03-16 9:36","24-03-16 01:36"
1,"22-03-16 10:36","25-03-16 11:46"
1,"23-03-16 11:36","28-03-16 10:16"'
)

df

#> # A tibble: 4 x 3
#>      ID          Date1          Date2
#>   <int>          <chr>          <chr>
#> 1     1  21-03-16 8:36 22-03-16 12:36
#> 2     1  23-03-16 9:36 24-03-16 01:36
#> 3     1 22-03-16 10:36 25-03-16 11:46
#> 4     1 23-03-16 11:36 28-03-16 10:16

df %>% 
  mutate_at(vars(Date1, Date2), dmy_hm) %>% 
  mutate_at(vars(Date1, Date2), funs("date" = date(.), "time" = as.hms(.))) %>% 
  select(-Date1, -Date2)

#> # A tibble: 4 x 5
#>      ID Date1_date Date2_date Date1_time Date2_time
#>   <int>     <date>     <date>     <time>     <time>
#> 1     1 2016-03-21 2016-03-22   08:36:00   12:36:00
#> 2     1 2016-03-23 2016-03-24   09:36:00   01:36:00
#> 3     1 2016-03-22 2016-03-25   10:36:00   11:46:00
#> 4     1 2016-03-23 2016-03-28   11:36:00   10:16:00

答案 1 :(得分:0)

使用dplyr进行操作:

convertTime <- function(x)as.POSIXct(x, format='%d-%m-%y %H:%M')

df %>% 
    mutate_at(vars(Date1, Date2), convertTime) %>% 
    group_by(ID) %>% 
    mutate_all(funs("date"=as.Date(.), "time"=format(., "%H:%M:%S")))


# Source: local data frame [4 x 7]
# Groups: ID [1]
# 
#      ID               Date1               Date2 Date1_date Date2_date Date1_time Date2_time
#   <int>              <dttm>              <dttm>     <date>     <date>      <chr>      <chr>
# 1     1 2016-03-22 12:36:00 2016-03-22 12:36:00 2016-03-22 2016-03-22   12:36:00   12:36:00
# 2     1 2016-03-24 01:36:00 2016-03-24 01:36:00 2016-03-23 2016-03-23   01:36:00   01:36:00
# 3     1 2016-03-25 11:46:00 2016-03-25 11:46:00 2016-03-25 2016-03-25   11:46:00   11:46:00
# 4     1 2016-03-28 10:16:00 2016-03-28 10:16:00 2016-03-28 2016-03-28   10:16:00   10:16:00

答案 2 :(得分:0)

我有同样的问题,你可以尝试这可能有助于使用 strsplit

x <- df$Date1    
y = t(as.data.frame(strsplit(as.character(x),' ')))
    row.names(y) = NULL

    # store splitted data into new columns 
    df$date <- y[,1] # date column
    df$time <- y[,2] # time column