一個簡單的問題:我知道如何在xts
中幫助幾年,幾個月和幾天的時間序列子集:x['2000-05/2001']
等等。按時間排序的子集xts對象
但是我怎樣才能在一天中的幾小時內對數據進行分類?我想在上午07:00到下午06:00之間獲取所有數據。也就是說,我想在業務時間內提取數據 - 與當天無關(稍後我會照顧週末)。幫助有一個例子的形式:
.parseISO8601('T08:30/T15:00')
但這不適用於我的情況。有人有線索嗎?
一個簡單的問題:我知道如何在xts
中幫助幾年,幾個月和幾天的時間序列子集:x['2000-05/2001']
等等。按時間排序的子集xts對象
但是我怎樣才能在一天中的幾小時內對數據進行分類?我想在上午07:00到下午06:00之間獲取所有數據。也就是說,我想在業務時間內提取數據 - 與當天無關(稍後我會照顧週末)。幫助有一個例子的形式:
.parseISO8601('T08:30/T15:00')
但這不適用於我的情況。有人有線索嗎?
如果您的xts
對象被稱爲x
,那麼像y <- x["T09:30/T11:00"]
這樣的東西對我來說就是例如早上會話的一部分。
出於某種原因,削減一天的XTS一次使用x["T09:30/T11:00"]
是相當緩慢的,我使用R: Efficiently subsetting dataframe based on time of day和data.table time subset vs xts time subset的方法,使具有類似的語法更快的功能:
cut_time_of_day <- function(x, t_str_begin, t_str_end){
tstr_to_sec <- function(t_str){
#"09:00:00" to sec of day
as.numeric(as.POSIXct(paste("1970-01-01", t_str), "UTC")) %% (24*60*60)
}
#POSIX ignores leap second
#sec_of_day = as.numeric(index(x)) %% (24*60*60) #GMT only
sec_of_day = {lt = as.POSIXlt(index(x)); lt$hour *60*60 + lt$min*60 + lt$sec} #handle tzone
sec_begin = tstr_to_sec(t_str_begin)
sec_end = tstr_to_sec(t_str_end)
return(x[ sec_of_day >= sec_begin & sec_of_day <= sec_end,])
}
測試:
n = 100000
dtime <- seq(ISOdate(2001,1,1), by = 60*60, length.out = n)
attributes(dtime)$tzone <- "CET"
x = xts((1:n), order.by = dtime)
y2 <- cut_time_of_day(x,"07:00:00", "09:00:00")
y1 <- x["T07:00:00/T09:00:00"]
identical(y1,y2)
感謝您演示xts的每日時間子集化速度有多快!我[創建了一個問題](https://github.com/joshuaulrich/xts/issues/193)致力於改進它。 –
你能給一個可重複的例子嗎? – agstudy
例如,如果你的'xts'對象被稱爲'x',那麼像'y < - x [「T09:30/T11:00」]'這樣的東西對我來說就是早晨會話的一部分。 – SlowLearner
@agstudy sample.time = timeDate('2012-01-01 00:00:00')+ 15 * 60 *(1:500) data = 1:500 data.ts = xts(data,order.by = sample.time) data.ts [「T09:30/T11:00」] – Richard