为什么某些单位会出现 round_date() returns 错误?

Why round_date() returns error for some units?

我尝试将日期(POSIXlt 对象)四舍五入到最接近的 5 分钟。我尝试将 round_date() 函数和 运行 用于以下情况:

> date
[1] "2012-11-01 15:41:00 EET"
> is.POSIXlt(date)
[1] TRUE
> round_date(date, "hour")
[1] "2012-11-01 16:00:00 EET"
> round_date(date, "min")
[1] "2012-11-01 15:41:00 EET"
> round_date(date, "5 mins")
Error in above - mid : non-numeric argument to binary operator

它似乎适用于秒、分、小时和天。示例中列出的所有其他单位 return 此错误。

我遵循了 线程的建议并指定了 tz,但这并没有改变任何东西。

period() 函数似乎工作正常:

> period("5 mins")
[1] "5M 0S"

上面的例子是为了简单起见,因为这个数据是数据框的一部分。我不知道这是否相关,但我也尝试使用变异和替换来解决它。失败

x 'origin' must be supplied

谢谢!

编辑

POSIXlt 对象可重现该问题。错误报告已提交。我的问题的快速修复是:

> round_date(as.POSIXct(date), "5 mins")
[1] "2012-11-01 15:40:00 EET"

round.POSIXt function/method 不支持在支持的时间单位之一之前放置数字修饰符,至少在帮助页面中没有记录。 seq.POSIXtcut.POSIXt 支持这样的功能 ,所以我当然可以理解为什么这可能是一个合理的假设。您可以通过将模除以相当于 5 分钟的秒数然后再乘以该数量来获得所需的结果,但是您当然需要重新转换为 POSIXlt class。 as.POSIXt.numeric 的陷阱之一是您确实需要指定一个“来源”,通常是“1970-01-01”。 (在我看来,这应该是默认假设。)

Allan 认为我再次阅读问题时过于草率,这一点是正确的。 (如果我看到类似以下内容的内容可能会有所帮助:

library(lubridate)

[编辑] 我的新猜测是这与 Daylight-to-Standard 时间切换有关。我无法通过以下方式复制错误:

x <- lubridate::ymd_hms("2009-08-03 12:01:59.23")
lubridate::round_date(x, "5 mins")
[1] "2009-08-03 12:00:00 UTC"

EET DST->标准转换是

Eastern European Time (EET), observed in countries including Bulgaria, Estonia, Finland, Greece, Latvia, Romania, Turkey, Ukraine. Daylight saving time starts at 03:00 local time, when clocks move forward to 04:00.

The Daylight Saving Time (DST) period in Europe runs from 01:00 UTC (Coordinated Universal Time) on the last Sunday of March to 01:00 UTC on the last Sunday of October every year.

[进一步编辑];又错了。现在我可以引起不良行为了。当“ymd_hms”创建的矢量转换为 POSIXlt class:

时,将小时提前到 3-4 小时后并不能解决问题
 x <- lubridate::ymd_hms("2012-11-01 15:41:00 EET",tz="EET")
 lubridate::round_date(x, "5 mins")
#[1] "2012-11-01 15:40:00 EET"

x <- lubridate::ymd_hms("2012-11-01 17:41:00 EET",tz="EET")
 lubridate::round_date(as.POSIXlt(x), "5 mins")
#Error in above - mid : non-numeric argument to binary operator

POSIXlt 对象上操作时 pkg:lubridate 中是否存在错误?在POSIXct对象上操作没有错误:

lubridate::round_date(as.POSIXct(x), "5 mins")
[1] "2012-11-01 17:40:00 EET"

报告R包疑似bug的方法是运行:

maintainer("lubridate")
#[1] "Vitalie Spinu <spinuvit@gmail.com>"

并发送带有 [MCVE] 的报告。