r - 与 as.difftime 不一致
问题描述
我可以将包含小时、分钟或秒规范的字符串转换为difftime
:
> as.difftime("12 h", "%H")
Time difference of 12 hours
> as.difftime("12 m", "%M")
Time difference of 12 mins
> as.difftime("12 s", "%S")
Time difference of 12 secs
但是我不能用一周的规范这样做,因为没有合适的格式……,虽然"weeks"
是一个合法的单位difftime
:
> as.difftime("12 w", "%…")
我忽略了什么吗?
解决方案
罗兰指出:
它不能工作超过几个小时。……很明显,如果你研究代码的话。相关部分是
difftime(strptime(tim, format = format), strptime("0:0:0", format = "%X"), units = units)
. 如果您仅指定时间,
strptime
则添加当前日期。
实际上,在R 控制台中研究代码很容易:
> as.difftime
function (tim, format = "%X", units = "auto")
{
if (inherits(tim, "difftime"))
return(tim)
if (is.character(tim)) {
difftime(strptime(tim, format = format), strptime("0:0:0",
format = "%X"), units = units)
}
else {
if (!is.numeric(tim))
stop("'tim' is not character or numeric")
if (units == "auto")
stop("need explicit units for numeric conversion")
if (!(units %in% c("secs", "mins", "hours", "days", "weeks")))
stop("invalid units specified")
.difftime(tim, units = units)
}
}
问题的症结在于,使用strptime
导致给定的时间间隔字符串as.difftime
被视为时间点,从中
减去当天的0 h。由于各种原因,这使得as.difftime
字符串在几天和几周内都无法使用,例如 0 天的值不被 接受strptime
,尽管它作为间隔完全有效。
对 R-devel 邮件列表的评论请求没有引起广泛的回应。(我通过私人邮件从 Emil Bode 收到了一些有价值的想法,因此我不会在这里复制它们。)因此,我将避免对 提出更改as.difftime
,因为更改它会导致 R 版本之间的差异。
推荐阅读
- batch-file - 如何从大量文件中删除文件扩展名?
- java - 使用java调用以表对象作为输入的oracle存储过程
- mysql - 有效地将两个选择查询合并为一个
- blazor-server-side - Websocket 以状态码关闭:1006 问题
- javascript - 将 Opus 音频数据文件解码为原始数据文件 Node JS
- python - 如何在一个熊猫数据框列中搜索字符串作为另一个数据框列中的子字符串
- python - 使用 PyInstaller 构建的 PyQt5 应用程序不起作用
- algorithm - Rust 内置的 `sort` 使用什么排序算法?
- java - 使用 hashlib 或其他方法将 Java MD5 `java.security.MessageDigest.getInstance("MD5")` 代码转换为 Python2.7
- ios - 从反应本机上传图像到服务器有空的身体