R:从可变格式时间戳中提取小时

R:从可变格式时间戳中提取小时,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我的数据帧有带秒和不带秒的时间戳,并且在月份和小时之前随机使用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

我的数据帧有带秒和不带秒的时间戳,并且在月份和小时之前随机使用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
我更喜欢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
df%>%mutate(hours=strtime(时间戳,'%H')%>%as.character())
#一个tibble:4×3
客户时间戳小时数
1A 2016年5月31日1:03:12 2016-10-31 05:00:00
2A 2016年5月25日01:06 2016-10-31 05:00:00
3B 2016年6月16日01:03 2016-10-31 06:00:00
4b 2015年12月30日23:04:25 2016-10-31 12:00:00

这里有一个解决方案,它在缺少时为秒添加
00
,然后使用
lubridate
转换为日期,并使用
格式提取小时数。注意,如果您不希望在小时结束时使用
00:00
,您可以在
格式中从输出格式中删除它们:

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
cust时间戳清洁时间小时
1A 2016年5月31日1:03:12 2016-05-31 01:03:12 01:00:00
2A 05/25/2016 01:06 2016-05-25 01:06:00 01:00:00
3B 2016年6月16日01:03 2016-06-16 01:03:00 01:00
4 B 2015年12月30日23:04:25 2015-12-30 23:04:25 23:00:00

这里有一个解决方案,它在缺少时为秒添加
00
,然后使用
lubridate
转换为日期,并使用
格式提取小时数。注意,如果您不希望在小时结束时使用
00:00
,您可以在
格式中从输出格式中删除它们:

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
cust时间戳清洁时间小时
1A 2016年5月31日1:03:12 2016-05-31 01:03:12 01:00:00
2A 05/25/2016 01:06 2016-05-25 01:06:00 01:00:00
3B 2016年6月16日01:03 2016-06-16 01:03:00 01:00
4 B 2015年12月30日23:04:25 2015-12-30 23:04:25 23:00:00

您的时间戳是一个字符串(),您需要将is格式化为日期(例如,
as.date
),然后才能开始使用类似于
strtime
的函数


在将数据转换为日期之前,您必须进行一些字符串操作以获得正确格式的数据。在0到月之间加上一个数字,在小时之后加上缺少的秒。使用
strsplit()
和其他正则表达式函数。然后执行
as.Date(df$timestamp,format='%m/%d/%Y%H:%m:%S')
,然后您将能够使用
strptime
提取小时数。

您的时间戳是一个字符串(),在开始使用类似
strptime
的函数之前,您需要将is格式化为日期(例如
as.Date

在将数据转换为日期之前,您必须进行一些字符串操作以获得正确格式的数据。在0到月之间加上一个数字,在小时之后加上缺少的秒。使用
strsplit()
和其他正则表达式函数。然后将
as.Date(df$timestamp,格式='%m/%d/%Y%H:%m:%S')
,然后您将能够使用
strtime
提取小时数。

尝试以下操作:

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
库(lubridate)
df%mutate(小时=小时(strtime(时间戳,%m/%d/%Y%H:%m'))%>%as.character()
客户时间戳小时数
1A 2016年5月31日1:03:12 1
2A 2016年5月25日01:06 1
3B 2016年6月16日09:03 9
4B 2015年12月30日23:04:25 23
试试这个:

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
库(lubridate)
df%mutate(小时=小时(strtime(时间戳,%m/%d/%Y%H:%m'))%>%as.character()
客户时间戳小时数
1A 2016年5月31日1:03:12 1
2A 2016年5月25日01:06 1
3B 2016年6月16日09:03 9
4B 2015年12月30日23:04:25 23

在提取小时数之前,您是否尝试将“时间戳”转换为日期时间?似乎是
as.POSIXct(df$timestamp,format=“%m/%d/%Y%H:%m”)
如果您不需要秒数,可能会帮您解决问题。在尝试提取小时数之前,您是否尝试过将“timestamp”转换为日期时间?似乎
as.POSIXct(df$timestamp,format=“%m/%d/%Y%H:%m”)
如果你不需要秒,可能会帮你完成这个任务。漂亮,@sandipan!要将小时转换为整数,也可以使用:df%>%mutate(小时=小时(时间戳,%m/%d/%Y%H:%m'))%>%as.integer())谢谢pal@IrakliBeautiful,@sandipan!要将小时转换为整数,也可以使用:df%>%mutate(小时=小时(时间戳,%m/%d/%Y%H:%m'))%>%as.integer())谢谢pal@Irakli