R:从可变格式时间戳中提取小时
R: extract hour from variable format timestamp
我的数据框有带秒和不带秒的时间戳,并在月份和小时前随机使用 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
这是一个解决方案,当秒数丢失时附加 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")
)
returns:
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
您的时间戳是一个字符串(),您需要格式化为日期(例如as.Date
),然后才能开始使用strptime
等功能。
在将数据转换为日期之前,您将不得不进行一些字符串操作以获得格式正确的数据。用一个数字在月份前面加上零,并在缺少秒的小时后附加 :00
。使用 strsplit()
和其他正则表达式函数。之后做as.Date(df$timestamp,format = '%m/%d/%Y %H:%M:%S')
,然后你就可以使用strptime
来提取小时数了。
试试这个:
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
我的数据框有带秒和不带秒的时间戳,并在月份和小时前随机使用 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
这是一个解决方案,当秒数丢失时附加 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")
)
returns:
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
您的时间戳是一个字符串(),您需要格式化为日期(例如as.Date
),然后才能开始使用strptime
等功能。
在将数据转换为日期之前,您将不得不进行一些字符串操作以获得格式正确的数据。用一个数字在月份前面加上零,并在缺少秒的小时后附加 :00
。使用 strsplit()
和其他正则表达式函数。之后做as.Date(df$timestamp,format = '%m/%d/%Y %H:%M:%S')
,然后你就可以使用strptime
来提取小时数了。
试试这个:
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