我的数据集中有一个列在下面:
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个字符然后是空格等解析数据的尝试?
答案 0 :(得分:1)
您可以使用lubridate
中的访问器来创建小时,分钟和第二列。我不清楚您希望“时间”列采用哪种格式。R支持日期时间和日期,但不仅仅支持时间。 lubridate
具有三个“时间长度”类,分别为period
,duration
和interval
。我在这里选择了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)))