R语言 如何解析时间-日期(非日期-时间)

3pvhb19x  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(167)

我有一个 Dataframe ,其中有几列包含时间/日期信息。我熟悉使用lubridate来解析日期-时间(即mm/dd/yyyy hh:mm:ss),但此 Dataframe 的日期时间顺序相反(即hh:mm:ss mm/dd/yyyy)。我如何将其读取为日期/时间?该列当前阅读为字符,这对我来说是无用的。下面是我的数据集的示例。我无法将“time_date”列读取为日期-时间。

df <- tribble(~activity, ~time_date, 
               "run", "15:06:17 03/08/2016", 
               "skip", "09:01:00 03/08/2016")
wfsdck30

wfsdck301#

您应该首先将其转换为具有正确格式的日期时间,然后您可以使用具有所需格式的strftime,如下所示:

datetimes <- as.POSIXct(df$time_date, format = "%H:%M:%S %m/%d/%Y")
df$time_date <- strftime(datetimes, format = "%m/%d/%Y %H:%M:%S")
df
#> # A tibble: 2 × 2
#>   activity time_date          
#>   <chr>    <chr>              
#> 1 run      03/08/2016 15:06:17
#> 2 skip     03/08/2016 09:01:00

创建于2023年1月4日,使用reprex v2.0.2

t9eec4r0

t9eec4r02#

dplyrlubridate在 * 字符 * 类数据上。

library(dplyr)
library(lubridate)

df %>% 
  rowwise() %>% 
  mutate(dd = strsplit(time_date, " "), 
         date_time = mdy_hms(paste(unlist(dd)[2], unlist(dd)[1])), 
         dd = NULL) %>%
  ungroup()
# A tibble: 2 × 3
  activity time_date           date_time          
  <chr>    <chr>               <dttm>             
1 run      15:06:17 03/08/2016 2016-03-08 15:06:17
2 skip     09:01:00 03/08/2016 2016-03-08 09:01:00

或者使用str_extract

df %>% 
  mutate(date_time = mdy_hms(paste(str_extract(time_date, " \\d+/.+"), 
                                   str_extract(time_date, "\\d+:.+ "))))
# A tibble: 2 × 3
  activity time_date           date_time          
  <chr>    <chr>               <dttm>             
1 run      15:06:17 03/08/2016 2016-03-08 15:06:17
2 skip     09:01:00 03/08/2016 2016-03-08 09:01:00
c3frrgcw

c3frrgcw3#

可以使用lubridate::parse_date_time()并将顺序指定为"HMS mdy"

library(dplyr)
library(lubridate)

df %>%
  mutate(date_time = parse_date_time(time_date, "HMS mdy"))
# A tibble: 2 × 3
  activity time_date           date_time          
  <chr>    <chr>               <dttm>             
1 run      15:06:17 03/08/2016 2016-03-08 15:06:17
2 skip     09:01:00 03/08/2016 2016-03-08 09:01:00

相关问题