将时间戳转换为日期,时间,小时,分钟

时间:2018-07-23 23:00:23

标签: r datetime lubridate

我的数据集中有一个列在下面:

df$timestamp

timestamp
2018-01-17 10:35:00 UTC
2015-05-08 17:30:00 UTC
2017-11-22 07:15:00 UTC
2017-12-05 07:30:00 UTC

str(timestamp)
chr [1:1196940] "2018-01-17 10:35:00 UTC" "2015-05-08 17:30:00 UTC" "2017-11-22 07:15:00 UTC" "2017-12-05 07:30:00 UTC" ...

我希望能够提取年-月-日,然后分别提取时间。

我的最终输出应该看起来像这样:

timestamp                           date          time     Hour      Minute
2018-01-17 10:35:00 UTC       2018-01-17      10:35:00       10          35
2015-05-08 17:30:00 UTC       2015-05-08      17:30:00       17          30      
2017-11-22 07:15:00 UTC       2017-11-22      07:15:00       07          15
2017-12-05 07:30:00 UTC       2017-12-05      07:30:00       07          30

是否可以使用lubridate之类的包来执行此操作,还是需要通过10个字符然后是空格等解析数据的尝试?

3 个答案:

答案 0 :(得分:1)

您可以使用lubridate中的访问器来创建小时,分钟和第二列。我不清楚您希望“时间”列采用哪种格式。R支持日期时间和日期,但不仅仅支持时间。 lubridate具有三个“时间长度”类,分别为perioddurationinterval。我在这里选择了duration,它可以跟踪物理时间而不是时钟时间,但是您可以根据需要进行更改。

library(tidyverse)
library(lubridate)
tbl <- tibble(
  timestamp = c(
    "2018-01-17 10:35:00 UTC",
    "2015-05-08 17:30:00 UTC",
    "2017-11-22 07:15:00 UTC",
    "2017-12-05 07:30:00 UTC"
  )
)

tbl %>%
  mutate(
    timestamp = ymd_hms(timestamp),
    date = date(timestamp),
    hours = hour(timestamp),
    minutes = minute(timestamp),
    seconds = second(timestamp),
    time = pmap(
      .l = list(hours, minutes, seconds),
      .f = ~ dhours(..1) + dminutes(..2) + dseconds(..3)
    )
  )
#> # A tibble: 4 x 6
#>   timestamp           date       hours minutes seconds time          
#>   <dttm>              <date>     <int>   <int>   <dbl> <list>        
#> 1 2018-01-17 10:35:00 2018-01-17    10      35       0 <S4: Duration>
#> 2 2015-05-08 17:30:00 2015-05-08    17      30       0 <S4: Duration>
#> 3 2017-11-22 07:15:00 2017-11-22     7      15       0 <S4: Duration>
#> 4 2017-12-05 07:30:00 2017-12-05     7      30       0 <S4: Duration>

reprex package(v0.2.0)于2018-07-23创建。

答案 1 :(得分:0)

这是一个使用tidyverse的{​​{1}}选项

purrr::map_df

样本数据

library(tidyverse)
bind_cols(df, map_df(
    c(date = "%Y/%m/%d", time = "%H:%M:%S", Hour = "%H", Minute = "%M"),
    ~format(as.POSIXct(df$timestamp), format = .x)))
#                timestamp       date     time Hour Minute
#1 2018-01-17 10:35:00 UTC 2018/01/17 10:35:00   10     35
#2 2015-05-08 17:30:00 UTC 2015/05/08 17:30:00   17     30
#3 2017-11-22 07:15:00 UTC 2017/11/22 07:15:00   07     15
#4 2017-12-05 07:30:00 UTC 2017/12/05 07:30:00   07     30

答案 2 :(得分:0)

类似于Calum您的回答,但是我想我们可以直接使用日期,小时和分钟。

library(lubridate)
new <- df %>%
  mutate(date = date(ymd_hms(test$timestamp)), 
  time = format(ymd_hms(test$timestamp), format = c("%H:%M:%S")), 
  Hour = hour(ymd_hms(test$timestamp)),
  Minute = minute(ymd_hms(test$timestamp)))