如何在R语言中为给定时间戳标记时段(上午、下午、晚上)
在R语言中为时间戳标记时段(上午/下午/晚上)
我来帮你搞定这个需求,下面是具体的实现步骤和代码:
第一步:准备初始数据
首先我们先把你的初始数据导入R中:
# 创建初始数据框 df <- data.frame( Id = c("3083188c", "924d500e", "ad4dd7ff"), Time_stamp = c("2016-08-29 13:10:51", "2016-08-29 09:22:33", "2016-08-25 20:29:35"), stringsAsFactors = FALSE )
第二步:转换时间戳格式
首先需要把字符型的Time_stamp转换成R能识别的时间格式,这里推荐两种常用方法:
方法1:使用lubridate包(更便捷)
lubridate是R中专门处理时间的工具包,语法非常直观:
# 安装并加载lubridate包(首次使用需要安装) # install.packages("lubridate") library(lubridate) # 转换时间格式为R可识别的datetime类型 df$Time_stamp <- ymd_hms(df$Time_stamp) # 提取时间中的小时数,用于后续判断时段 df$hour <- hour(df$Time_stamp)
方法2:使用base R(无需额外安装包)
如果不想安装新包,用base R的原生函数也能实现:
# 转换时间格式并提取小时数 df$hour <- as.integer(format(strptime(df$Time_stamp, "%Y-%m-%d %H:%M:%S"), "%H"))
第三步:根据小时标记时段
按照你的示例逻辑,我们把时段划分为:
- 上午:6:00 - 12:00
- 下午:12:00 - 18:00
- 晚上:18:00 - 次日6:00
这里提供两种实现方式:
方法1:使用dplyr的case_when(逻辑更清晰)
# 安装并加载dplyr包(首次使用需要安装) # install.packages("dplyr") library(dplyr) df <- df %>% mutate(Time_of_day = case_when( hour >= 6 & hour < 12 ~ "上午", hour >= 12 & hour < 18 ~ "下午", TRUE ~ "晚上" # 其余时段(0-6点、18-24点)统一归为晚上 )) %>% select(-hour) # 移除临时的hour列
方法2:使用base R的嵌套ifelse
# 嵌套ifelse判断时段 df$Time_of_day <- ifelse(df$hour >=6 & df$hour <12, "上午", ifelse(df$hour >=12 & df$hour <18, "下午", "晚上")) # 移除临时的hour列 df <- df[, !names(df) %in% "hour"]
最终结果
运行完上述代码后,你就能得到想要的结果:
print(df) # Id Time_stamp Time_of_day # 1 3083188c 2016-08-29 13:10:51 下午 # 2 924d500e 2016-08-29 09:22:33 上午 # 3 ad4dd7ff 2016-08-25 20:29:35 晚上
如果需要调整时段的划分规则,只需要修改判断条件里的小时区间就可以啦~
内容的提问来源于stack exchange,提问作者ajax
相关产品推荐
相关产品推荐

