为何lubridate中hm(7.4)与hm(7.04)均返回7H 4M 0S?
解决lubridate中
hm()函数解析数值时分的异常问题 问题原因
lubridate::hm()函数的核心作用是解析带时分格式的字符串(比如"7:40"、"7h40m"、"7.40"),而非将数值的小数部分按比例转换为分钟。当你传入数值7.4或7.04时,它们会先被自动转换为字符串"7.4"和"7.04",hm()会将小数点视为小时与分钟的分隔符,因此:
"7.4"被解析为7小时4分钟"7.04"同样被解析为7小时4分钟(小数点后两位的前导零不影响分钟数解析)
这并非函数异常,而是参数格式不符合hm()的设计预期。
解决方案
根据你的需求(将7.4对应为7小时40分钟),分两种场景处理:
场景1:输入是「小时的小数形式」(如7.4小时 = 7小时 + 0.4×60分钟)
直接通过数值计算转换为时分格式:
library(lubridate) # 方法1:拆分小时和分钟后构造hms对象 hms(hours = floor(7.4), minutes = (7.4 - floor(7.4)) * 60) # 输出:"7H 40M 0S" # 方法2:用duration转换后转为hms格式 as_hms(duration(hours = 7.4)) # 输出:"7H 40M 0S"
场景2:输入是「时分的小数分隔写法」(如想表达7:40,写成7.40)
直接传入字符串格式的参数,让hm()正确解析:
hm("7.40") # 输出:"7H 40M 0S" # 更推荐的标准写法 hm("7:40") # 输出:"7H 40M 0S"
内容的提问来源于stack exchange,提问作者MathGorilla
相关产品推荐
相关产品推荐

