【问题标题】:Converting irregular timestamp data to regularly spaced data using R使用 R 将不规则时间戳数据转换为规则间隔数据
【发布时间】:2011-03-15 09:58:43
【问题描述】:

在数据库中,我有带有相关时间戳的数据。时间戳本质上是随机的,分辨率可达几分钟。我想使用 R 相对于时间戳(具有秒分辨率)使这些数据统一,并将 NA 替换为先前的值。此外,每个时间戳都应包含所有符号的数据。我尝试了一些时间序列包来使数据统一,但没有成功。

这是我目前运行的代码

library("RPostgreSQL")  
library(DBI)  
library(sqldf)  
drv <- dbDriver("PostgreSQL")  
ch <- dbConnect(drv, dbname="derivativesData", 
                     user="postgres", password="postgres")  
companyFrame <- dbGetQuery(ch, "select * from derData")  
companyFrame$trade_time  
  [1] "2011-06-01 09:00:00 IST" "2011-06-01 09:00:00 IST"  
  [3] "2011-06-01 09:00:00 IST" "2011-06-01 09:00:00 IST"  
  [5] "2011-06-01 09:00:00 IST" "2011-06-01 09:00:00 IST"  
  [7] "2011-06-01 09:00:00 IST" "2011-06-01 09:00:00 IST"  
  [9] "2011-06-01 09:00:00 IST" "2011-06-01 09:01:00 IST"  
 [11] "2011-06-01 09:01:00 IST" "2011-06-01 09:01:00 IST"  
 [13] "2011-06-01 09:02:00 IST" "2011-06-01 09:02:00 IST"  
 [15] "2011-06-01 09:02:00 IST" "2011-06-01 09:03:00 IST"  
 [17] "2011-06-01 09:04:00 IST" "2011-06-01 09:04:00 IST"  
 [19] "2011-06-01 09:05:00 IST" "2011-06-01 09:05:00 IST"  
 [21] "2011-06-01 09:06:00 IST" "2011-06-01 09:06:00 IST"  
 [23] "2011-06-01 09:06:00 IST" "2011-06-01 09:07:00 IST"  
 [25] "2011-06-01 09:08:00 IST" "2011-06-01 09:09:00 IST"  
 [27] "2011-06-01 09:10:00 IST" "2011-06-01 09:10:00 IST"  

我想将此数据转换为分辨率为 10 秒的统一格式。

【问题讨论】:

  • 在您的示例中,您的时间没有秒精度,它们似乎四舍五入到分钟,所以很难使用 10 秒的分辨率?

标签: r time


【解决方案1】:

这里我将使用 10 分钟的分辨率,因为您的时间没有任何秒...

使用以下示例数据:

R> time <- c("2011-06-01 09:00:00 IST", "2011-06-01 09:00:00 IST", "2011-06-01 09:01:00 IST", 
+            "2011-06-01 09:06:00 IST", "2011-06-01 09:10:00 IST", "2011-06-01 09:15:00 IST")

您可以先将字符串转换为POSIXlt 日期格式:

R> time2 <- strptime(time, format="%Y-%m-%d %X")
R> time2
[1] "2011-06-01 09:00:00" "2011-06-01 09:00:00" "2011-06-01 09:01:00"
[4] "2011-06-01 09:06:00" "2011-06-01 09:10:00" "2011-06-01 09:15:00"

然后您可以使用 lubridate 包中的 minute 函数来更改日期的分钟部分并将其四舍五入为 10 分钟分辨率,例如:

R> library(lubridate)
R> minute(time2) <- minute(time2) %/% 10 * 10
R> time2
[1] "2011-06-01 09:00:00 CEST" "2011-06-01 09:00:00 CEST"
[3] "2011-06-01 09:00:00 CEST" "2011-06-01 09:00:00 CEST"
[5] "2011-06-01 09:10:00 CEST" "2011-06-01 09:10:00 CEST"

【讨论】:

  • 谢谢。但我想要一个秒的分辨率。这可能吗?然后想按时间戳的升序对齐行。请提出任何想法。
  • 当然,只需将minute 函数替换为second。然后使用order 对生成的数据框进行排序。
【解决方案2】:

试试data.table 包,它的roll=TRUE 功能。请参阅 ?data.table 和其中谈到快速最后一次观察的小插曲。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2011-04-23
    • 2021-07-20
    • 2020-09-21
    • 2013-10-08
    • 2019-08-31
    • 2018-04-16
    相关资源
    最近更新 更多