【问题标题】:How to convert xts timeseries to hourly difference from 00:00:00如何将 xts 时间序列转换为 00:00:00 的小时差
【发布时间】:2026-01-08 10:10:01
【问题描述】:

我有一个 xts 时间序列

Timestamp           - X
30-07-2019 23:00:00 - 110
31-07-2019 00:00:00 - 120 
31-07-2019 01:00:00 - 105
31-07-2019 02:00:00 - 110 
31-07-2019 03:00:00 - 100 
31-07-2019 04:00:00 - 105 
31-07-2019 05:00:00 - 115 
31-07-2019 06:00:00 - 125

现在我希望时间戳是一天中的小时,例如

Timestamp - X
-1        - 110
0         - 120 
1         - 105
2         - 110 
3         - 100 
4         - 105 
5         - 115 
6         - 125

并且仍然将其保留为 xts 系列,以便在闪亮的应用程序中将其与 dygraph 一起使用

【问题讨论】:

  • xts 'index' ("timestamp") 不能简单地是一天中的小时。它必须是日期时间格式。不过,您可以在 xts 对象中创建一个数字列来存储时间戳的小时数。或者,制作一个 data.frame/data.table 用于输入到 dygraph

标签: r timestamp sequence xts


【解决方案1】:

始终尝试以dput 或我制作数据的方式提供您的数据

这是一步一步的方法

Timestamp <- c("30-07-2019 23:00:00", "31-07-2019 00:00:00", "31-07-2019 01:00:00", "31-07-2019 02:00:00", "31-07-2019 03:00:00", "31-07-2019 04:00:00", "31-07-2019 05:00:00", "31-07-2019 06:00:00")
X <- c("-110","- 120","- 105","- 110","- 100","- 105","- 115","- 125")

#DF creation
df <- data.frame(Timestamp = Timestamp,X = X)

#Extracting `time` like `23:00:00`      
df$Timestamp <- sub(".* ", "", df$Timestamp)

#extracting only hours  
df$Timestamp <- format(strptime(df$Timestamp, format='%H:%M:%S'), '%H')

#converting into `Numeric` or `integer`
df$Timestamp <- as.integer(df$Timestamp)

#finally loop to get the desired result
for(i in df$Timestamp){
    if(i <= 12){
        df[,1][which(df$Timestamp == i)] <- i
    } else if(i > 12) {
        df[,1][which(df$Timestamp == i)] <- i-24
        } 
}

输出

Timestamp  X
-1        - 110
 0        - 120
 1        - 105
 2        - 110
 3        - 100
 4        - 105
 5        - 115
 6        - 125

编辑:简洁的方式,这也应该有效

 df <- data.frame(Timestamp = Timestamp,X = X)

 #applying `POSIXct`
 df$Timestamp <- as.integer(format(as.POSIXct(df$Timestamp, format="%d-%m-%Y %H:%M:%S"), "%H"))

 #loop
 df$Timestamp <- ifelse(df$Timestamp<=12,df$Timestamp,df$Timestamp-24)

【讨论】:

    【解决方案2】:

    另一种选择是使用lubridate 方法:

    library(lubridate)
    hours_from_midnight <- hour(dmy_hms(df$Timestamp))
    # boolean vector indicating if the time mome
    after_midday <- pm(dmy_hms(df$Timestamp))
    # coercion boolean to numerical is used
    df$hour <- hours_from_midnight - 24 * after_midday
    

    【讨论】:

    • 但是请注意,这可能不适用于 dygraph,因为 df$hour 不是 df 的索引
    最近更新 更多