使用lubridate从R

时间:2017-04-17 16:09:22

标签: r date finance lubridate

上下文

作为Exclude specific time periods in R

的后续内容
>str(databank[[1]])
'data.frame':   987344 obs. of  13 variables:
 $ Date      : Factor w/ 43 levels "01/03/2017","02/03/2017",..: 17 17 17 17 17 17 17 17 17 17 ...
 $ Time      : Factor w/ 23400 levels "01:00:00 PM",..: 15344 15343 15342 15341 15340 15339 15338 15337 15336 15335 ...
 $ Bar.      : Factor w/ 63033 levels "","1/63032","10/63032",..: 58929 1 1 1 1 1 1 1 58928 1 ...
 $ Bar.Index : int  0 NA NA NA NA NA NA NA -1 NA ...
 $ Tick.Range: int  5 NA NA NA NA NA NA NA 0 NA ...
 $ Open      : num  16.9 NA NA NA NA ...
 $ High      : num  16.9 NA NA NA NA ...
 $ Low       : num  16.9 NA NA NA NA ...
 $ Close     : num  16.9 NA NA NA NA ...
 $ Vol       : num  900 0 0 0 0 0 0 0 100 0 ...
 $ MACDHist  : num  -137 NA NA NA NA ...
 $ MACD      : num  -225 NA NA NA NA ...
 $ MACDSig   : num  -87.9 NA NA NA NA ...

> head(databank[[1]]) Date Time Bar. Bar.Index Tick.Range Open High Low Close 1 12/04/2017 10:45:43 AM 63032/63032 0 5 16.95 16.95 16.9 16.95 2 12/04/2017 10:45:42 AM NA NA NA NA NA NA 3 12/04/2017 10:45:41 AM NA NA NA NA NA NA 4 12/04/2017 10:45:40 AM NA NA NA NA NA NA 5 12/04/2017 10:45:39 AM NA NA NA NA NA NA 6 12/04/2017 10:45:38 AM NA NA NA NA NA NA Vol MACDHist MACD MACDSig 1 900 -136.77 -224.68 -87.91 2 0 NA NA NA 3 0 NA NA NA 4 0 NA NA NA 5 0 NA NA NA 6 0 NA NA NA

问题

我尝试使用以下方法实现最佳答案的rubridate方法:

test1 <- databank[[1]][hour(d) == 9 & minute(d) > 30,]

但它只返回从9:30:00到9:59:59的时间,从9:35:00到15:55:00获取时间......

我尝试过的事情

test1 <- databank[[1]][hour(d) == 9 & minute(d) > 30, hour(d) == 15 & minute(d) < 55]

test1 <- databank[[1]][hour(d) == 9 & minute(d) > 30 & hour(d) == 15 & minute(d) < 55, ]

但是前者返回一个空表,其中约有79,000个空行(只有条目号)而没有标题,后者是一个只有标题的空表。我认为这是一个问题,因为我的日期和时间不在POSIX中,但在转换它们时遇到了麻烦......

我错过了什么?

3 个答案:

答案 0 :(得分:0)

在其他SO答案中遇到|操作数后,我实现了它并得到了这个:

test1 <- databank[[1]][(hour(d) == 9 & minute(d) > 34) | (hour(d) == 10 & minute(d) > 0) | (hour(d) == 11 & minute(d) > 0) | (hour(d) == 12 & minute(d) > 0) | (hour(d) == 01 & minute(d) > 0) | (hour(d) == 02 & minute(d) > 0) | (hour(d) == 03 & minute(d) <= 54), ]

鉴于知识有限,这是一个丑陋的解决方案,但它确实有效。

Per Uwe Block的建议:

databank[[1]][hour(d) == 9 & minute(d) >= 35) | hour(d) %in% 10:14 | (hour(d) == 15 & minute(d) < 55]

我非常欢迎看到一个更优雅的解决方案!

答案 1 :(得分:0)

你的问题不是很清楚你的起始条件是什么。为了适应时间(没有相关日期),chron包很方便。

#create a random time sequnce
h<-rep( c(1:22), each=2)
m <- c(1:44)
randomtimes<-paste(h, m, "00", sep=":")

library(chron)
#convert the time strings in time objects
samplet<- times(randomtimes)

#perform comparison and subset
samplet[(samplet > times("9:30:00") & samplet< times("15:55:00"))]

答案 2 :(得分:0)

实际问题中提供的数据样本databank[[1]]此处)与引用问题Exclude specific time periods in R )中的情况不同:

  1. 此处的timestamp 已转换为课程POSIXct,而DateTime 此处是在单独的factor列中。
  2. 此处Time使用带有AM / PM指示符的12小时时钟。
  3. 有可能使用Time的因子水平,但这是不可靠的。因此,恕我直言,最安全的方法是从POSIXctDate列创建Time时间戳,并在以后按时间(无日期)进行选择。

    添加时间戳

    databank[[1L]]$datetime <- 
      with(databank[[1L]], as.POSIXct(paste(Date, Time), "%d/%m/%Y %I:%M:%S %p", tz = "GMT"))
    

    添加时间

    为方便起见,将time_of_day(无日期)列添加为字符:

    databank[[1L]]$time_of_day <- 
      with(databank[[1L]], format(datetime, "%T"))
    
    databank[[1L]][, c("Date", "Time", "datetime", "time_of_day")]
    #         Date        Time            datetime time_of_day
    #1: 12/04/2017 10:45:43 AM 2017-04-12 10:45:43    10:45:43
    #2: 12/04/2017 10:45:42 AM 2017-04-12 10:45:42    10:45:42
    #3: 12/04/2017 10:45:41 AM 2017-04-12 10:45:41    10:45:41
    #4: 12/04/2017 10:45:40 AM 2017-04-12 10:45:40    10:45:40
    #5: 12/04/2017 10:45:39 AM 2017-04-12 10:45:39    10:45:39
    #6: 12/04/2017 10:45:38 AM 2017-04-12 10:45:38    10:45:38
    #7: 12/04/2017 10:45:00 PM 2017-04-12 22:45:00    22:45:00
    

    请注意,我已添加PM时间进行说明。

    按时间范围选择行

    databank[[1L]][time_of_day >= "09:35:00" & time_of_day < "15:55:00", ]