1

我的数据框有带和不带秒的时间戳,并且在月份和小时前随机使用 0,即 01 或 1

library(tidyverse)
df <- data_frame(cust=c('A','A','B','B'), timestamp=c('5/31/2016 1:03:12', '05/25/2016 01:06',
                                           '6/16/2016  01:03', '12/30/2015 23:04:25'))
cust     timestamp
 A      5/31/2016 1:03:12
 A      05/25/2016 01:06
 B      6/16/2016  01:03
 B      12/30/2015 23:04:25

如何将小时数提取到单独的列中?所需的输出:

 cust     timestamp            hours
 A      5/31/2016 1:03:12       1
 A      05/25/2016 01:06        1
 B      6/16/2016  9:03         9
 B      12/30/2015 23:04:25    23  

我更喜欢 tidyverse 和 mutate 的答案,但我的尝试未能正确提取小时数:

df %>% mutate(hours=strptime(timestamp, '%H') %>% as.character() )

# A tibble: 4 × 3
   cust           timestamp               hours
  <chr>               <chr>               <chr>
1     A   5/31/2016 1:03:12 2016-10-31 05:00:00
2     A    05/25/2016 01:06 2016-10-31 05:00:00
3     B    6/16/2016  01:03 2016-10-31 06:00:00
4     B 12/30/2015 23:04:25 2016-10-31 12:00:00
4

3 回答 3

4

尝试这个:

library(lubridate)
df <- data.frame(cust=c('A','A','B','B'), timestamp=c('5/31/2016 1:03:12', '05/25/2016 01:06',
                                                      '6/16/2016  09:03', '12/30/2015 23:04:25'))
df %>% mutate(hours=hour(strptime(timestamp, '%m/%d/%Y %H:%M')) %>% as.character() )

cust           timestamp   hours
1    A   5/31/2016 1:03:12     1
2    A    05/25/2016 01:06     1
3    B    6/16/2016  09:03     9
4    B 12/30/2015 23:04:25    23
于 2016-10-31T15:48:41.517 回答
1

这是一个解决方案,00当它们丢失时附加秒数,然后使用转换为日期lubridate并使用 提取小时数format。请注意,如果您不希望00:00在下班时出现,您可以将它们从输出格式中删除format

df %>%
  mutate(
    cleanTime = ifelse(grepl(":[0-9][0-9]:", timestamp)
                       , timestamp
                       , paste0(timestamp, ":00")) %>% mdy_hms
    , hour = format(cleanTime, "%H:00:00")
    )

返回:

   cust           timestamp           cleanTime     hour
  <chr>               <chr>              <dttm>    <chr>
1     A   5/31/2016 1:03:12 2016-05-31 01:03:12 01:00:00
2     A    05/25/2016 01:06 2016-05-25 01:06:00 01:00:00
3     B    6/16/2016  01:03 2016-06-16 01:03:00 01:00:00
4     B 12/30/2015 23:04:25 2015-12-30 23:04:25 23:00:00
于 2016-10-31T15:42:43.370 回答
1

您的时间戳是一个字符串 (),您需要将其格式化为日期(as.Date例如),然后才能开始使用strptime.

在将数据转换为日期之前,您将不得不通过一些字符串操作来获得正确格式化的数据。用一个数字在月份前加上零,并:00在缺少秒的情况下附加到小时。使用strsplit()和其他正则表达式函数。之后做as.Date(df$timestamp,format = '%m/%d/%Y %H:%M:%S'),然后你就可以strptime用来提取小时数了。

于 2016-10-31T15:45:32.140 回答