非常规时间格式转小时及特定日期时分提取的技术实现问询
嘿,针对你提出的两个时间格式转换需求,我分别用Python和R给出最简洁的实现方案,帮你高效完成操作分布分析:
需求1:将非常规时间格式转换为小时数
这里的「非常规」涵盖多种场景,我挑选两种最常见的情况给出实现:
场景1:类似"X小时Y分钟"的字符串转小时数(比如"3h45m"→3.75)
Python实现
def str_to_hours(time_str): hours = 0 # 提取小时部分 if 'h' in time_str: hours += float(time_str.split('h')[0]) # 提取分钟部分并转换为小时 if 'm' in time_str: minutes_part = time_str.split('m')[0].split('h')[-1] hours += float(minutes_part)/60 return hours # 测试示例 print(str_to_hours("3h45m")) # 输出 3.75
R实现
str_to_hours <- function(time_str) { hours <- 0 # 提取小时部分 if (grepl("h", time_str)) { hours <- as.numeric(substr(time_str, 1, regexpr("h", time_str)-1)) } # 提取分钟部分并转换为小时 if (grepl("m", time_str)) { minutes_part <- sub(".*h", "", time_str) minutes_part <- sub("m.*", "", minutes_part) hours <- hours + as.numeric(minutes_part)/60 } return(hours) } # 测试示例 print(str_to_hours("3h45m")) # 输出 3.75
场景2:将完整日期时间转成当天的小时数(比如19:33:28→约19.5578)
Python实现
from datetime import datetime # 解析时间(也可以用需求2的方法解析带时区的字符串) dt = datetime(2017, 1, 1, 19, 33, 28) # 计算当天的小时数 hours = dt.hour + dt.minute/60 + dt.second/3600 print(hours) # 输出约19.5578
R实现
library(lubridate) # 解析带时区的时间字符串 dt <- ymd_hms("2017-01-01T19:33:28+0000") # 计算当天的小时数 hours <- hour(dt) + minute(dt)/60 + second(dt)/3600 print(hours) # 输出约19.5578
需求2:将"2017-01-01T19:33:28+0000"转换为仅保留小时和分钟的格式
这个是标准的带时区ISO时间格式,不管是单条处理还是批量分析,都有非常简洁的实现方式:
Python实现
单条时间字符串处理
from datetime import datetime time_str = "2017-01-01T19:33:28+0000" # 解析带时区的时间,%z对应时区偏移量 dt = datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%S%z") # 格式化为HH:MM hh_mm = dt.strftime("%H:%M") print(hh_mm) # 输出 '19:33'
批量数据集处理(适合分析操作分布)
用pandas可以高效处理整列数据,还能直接筛选19:00-21:00的记录:
import pandas as pd # 模拟数据集 df = pd.DataFrame({ "time": ["2017-01-01T19:33:28+0000", "2017-01-01T20:15:42+0000", "2017-01-01T18:50:10+0000"] }) # 解析时间列,自动识别时区 df["datetime"] = pd.to_datetime(df["time"]) # 提取小时分钟格式 df["hh_mm"] = df["datetime"].dt.strftime("%H:%M") # 筛选19:00-21:00的操作记录 filtered_df = df[df["datetime"].dt.hour.isin([19, 20])] print(filtered_df)
R实现
单条时间字符串处理
用lubridate包可以自动识别ISO格式,非常省心:
library(lubridate) time_str <- "2017-01-01T19:33:28+0000" # 解析带时区的时间 dt <- ymd_hms(time_str) # 格式化为HH:MM hh_mm <- format(dt, "%H:%M") print(hh_mm) # 输出 "19:33"
批量数据集处理(适合分析操作分布)
library(lubridate) library(dplyr) # 模拟数据集 df <- data.frame( time = c("2017-01-01T19:33:28+0000", "2017-01-01T20:15:42+0000", "2017-01-01T18:50:10+0000") ) # 解析时间列并提取小时分钟 df <- df %>% mutate(datetime = ymd_hms(time)) %>% mutate(hh_mm = format(datetime, "%H:%M")) %>% # 筛选19:00-21:00的记录 filter(hour(datetime) %in% 19:20) print(df)
内容的提问来源于stack exchange,提问作者Pallison
相关产品推荐
相关产品推荐

