【发布时间】:2015-07-13 19:51:57
【问题描述】:
我今天遇到了以下问题,我想知道是否有更好的方法来完成我想做的事情。
假设我有以下data.table(只是一个小时的时间戳):
library(data.table)
tdt <- data.table(Timestamp = seq(as.POSIXct("1980-01-01 00:00:00"), as.POSIXct("2015-01-01 00:00:00"), '1 hour'))
> tdt
Timestamp
1: 1980-01-01 00:00:00
2: 1980-01-01 01:00:00
3: 1980-01-01 02:00:00
4: 1980-01-01 03:00:00
5: 1980-01-01 04:00:00
---
306813: 2014-12-31 20:00:00
306814: 2014-12-31 21:00:00
306815: 2014-12-31 22:00:00
306816: 2014-12-31 23:00:00
306817: 2015-01-01 00:00:00
我的目标是将时间戳的分钟更改为 10 分钟。
我知道我可以使用:
library(lubridate)
minute(tdt$Timestamp) <- 10
但这并没有利用数据表的超快速度(我需要)。在我的笔记本电脑上,这是:
> system.time(minute(tdt$Timestamp) <- 10)
user system elapsed
11.29 0.16 11.45
所以,我的问题是:我们能否以某种方式在数据表语法中使用替换函数,以便使用 data.table 的速度完成我想要的操作?如果答案是否定的,那么任何其他data.table 解决方案都可以快速执行此操作。
如果您想知道我尝试过的其中一件事是:
tdt[, Timestamp2 := minute(Timestamp) <- 10]
这不起作用。
预期输出(但带有数据表语法):
> tdt
Timestamp
1: 1980-01-01 00:10:00
2: 1980-01-01 01:10:00
3: 1980-01-01 02:10:00
4: 1980-01-01 03:10:00
5: 1980-01-01 04:10:00
---
306813: 2014-12-31 20:10:00
306814: 2014-12-31 21:10:00
306815: 2014-12-31 22:10:00
306816: 2014-12-31 23:10:00
306817: 2015-01-01 00:10:00
【问题讨论】:
-
我认为这可能会为您指明正确的方向:stackoverflow.com/questions/10449366/…。但至少截至去年
data.table并不能很好地支持日期/时间格式。现在可能已经有所改善。 -
tdt[, Timestamp := Timestamp + 600L]怎么样? -
@AriB.Friedman 感谢您提供此链接。我已经看到了这个问题,并且我知道替换功能是如何工作的,但是我仍然无法以某种方式使用它...
-
@DavidArenburg 这是伟大的戴夫,非常感谢。老实说,我明天将使用此解决方案。出于好奇,我想看看是否有办法将通用替换函数与
data.table语法结合使用。随意发布它作为答案。如果没有其他人提供补充函数 + data.table 语法的解决方案,我会接受。 -
您是否对真实数据进行了基准测试,或者您明天才能做到?
标签: r data.table