使用reticulate如何将Python datetime.time转为R时间类?
解决Reticulate读取Python datetime.time对象的转换问题
核心原因
Python的datetime.time对象与datetime.date对象结构不同,reticulate的py_to_r()函数默认支持直接转换date对象为R的Date类型,但对time对象没有内置转换规则,导致直接调用py_to_r()无法得到预期的R时间类型。
方法1:手动提取时间属性转换为R的hms类型
直接从Python的time对象中提取时、分、秒属性,用R的hms包创建标准时间类型:
# 加载依赖包 library(reticulate) library(hms) # 转换时间列 data$time <- do.call(c, lapply(data$time, function(py_time) { # 提取Python time对象的属性 hour <- py_to_r(py_time$hour) minute <- py_to_r(py_time$minute) second <- py_to_r(py_time$second) # 创建hms类型的时间值 hms(hour = hour, minute = minute, second = second) }))
执行后,data$time会变成R的hms类型向量,支持标准时间操作与展示。
方法2:先转成字符串再解析
无需额外依赖包,先调用Python对象的字符串方法,再在R中解析为时间类型:
library(reticulate) # 转换时间列 data$time <- do.call(c, lapply(data$time, function(py_time) { # 获取Python time对象的字符串表示 time_str <- py_to_r(py_time$`__str__`()) # 解析为R的时间类型 strptime(time_str, format = "%H:%M:%S")$time }))
这种方法会得到R的POSIXlt类型的时间部分,可根据需求调整格式。
可选方案:修改Python脚本简化转换
如果允许修改生成数据框的Python脚本,可提前将time列转换为字符串或带默认日期的datetime对象,减少R端的处理工作:
# Python脚本中修改时间列 import pandas as pd # 假设df是原数据框 # 方案1:转为字符串 df['time'] = df['time'].astype(str) # 方案2:转为带默认日期的datetime对象 df['time'] = pd.to_datetime('1970-01-01 ' + df['time'].astype(str))
修改后在R中用py_run_file(convert=F)读取时,直接调用py_to_r()即可转换为R的字符型或POSIXct类型。
内容的提问来源于stack exchange,提问作者Aditya Kumar Kasinadhuni
相关产品推荐
相关产品推荐

