我的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一起使用
答案 0 :(得分: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)
答案 1 :(得分:0)
另一种选择是使用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