2014-09-01 24 views
-1

我的数据框ask.subset包含除一些其他东西(汇率数据[Open,Close,Volume等])之外的日期。一个典型的交易日是从第1天的UTC时间21:00:00到第2天UTC的21:00:00。我的日期列在CET中,所以我必须将它们移动2小时以满足我的需求,我使用ask.subset$Time$hour<-ask.subset$Time$hour+2因为日期格式为POSIXlt。 因此2004-01-02 22:00:00变成2004-01-03 00:00:00。但是如果我想抓住这个特定日期的工作日,它仍然会返回2004-01-02 22:00:00的工作日。所以平日里没有变化。我怎样才能做到这一点?在POSIXlt加入小时时没有星期几的转换

重复的例子:

structure(list(Time = structure(list(sec = c(0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), min = c(0L, 
5L, 10L, 15L, 20L, 25L, 30L, 35L, 40L, 45L, 50L, 55L, 0L, 5L, 
10L, 15L, 20L, 25L, 30L, 35L, 40L, 45L, 50L, 55L, 0L), hour = c(22L, 
22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 23L, 23L, 
23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 0L), mday = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L), mon = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L), year = c(104L, 104L, 104L, 104L, 104L, 104L, 
104L, 104L, 104L, 104L, 104L, 104L, 104L, 104L, 104L, 104L, 104L, 
104L, 104L, 104L, 104L, 104L, 104L, 104L, 104L), wday = c(4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L), yday = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 1L), isdst = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L 
), zone = c("CET", "CET", "CET", "CET", "CET", "CET", "CET", 
"CET", "CET", "CET", "CET", "CET", "CET", "CET", "CET", "CET", 
"CET", "CET", "CET", "CET", "CET", "CET", "CET", "CET", "CET" 
), gmtoff = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_)), .Names = c("sec", "min", "hour", "mday", "mon", 
"year", "wday", "yday", "isdst", "zone", "gmtoff"), class = c("POSIXlt", 
"POSIXt"), tzone = "CET"), Open = c(1.25436, 1.2545, 1.25488, 
1.25533, 1.25542, 1.25562, 1.25548, 1.25579, 1.2556, 1.25605, 
1.25555, 1.25608, 1.25668, 1.25647, 1.25647, 1.25647, 1.25646, 
1.25721, 1.25697, 1.25728, 1.25753, 1.25777, 1.25758, 1.25775, 
1.25717), High = c(1.25464, 1.25498, 1.25547, 1.25561, 1.25567, 
1.25569, 1.25581, 1.25595, 1.25597, 1.25616, 1.25632, 1.2565, 
1.25681, 1.2567, 1.2569, 1.25716, 1.25711, 1.25728, 1.25751, 
1.25775, 1.25811, 1.25923, 1.25788, 1.258, 1.25818), Low = c(1.25403, 
1.25445, 1.25468, 1.25519, 1.25534, 1.25536, 1.25528, 1.2553, 
1.25541, 1.25545, 1.25555, 1.25599, 1.25621, 1.25582, 1.2562, 
1.25637, 1.25646, 1.25671, 1.25688, 1.25722, 1.25741, 1.25746, 
1.25738, 1.25729, 1.25717), Close = c(1.25446, 1.25477, 1.25533, 
1.25529, 1.25554, 1.25547, 1.25577, 1.25537, 1.25576, 1.25555, 
1.2561, 1.2565, 1.25645, 1.25635, 1.25634, 1.25642, 1.25696, 
1.25677, 1.25716, 1.25766, 1.25791, 1.25907, 1.25775, 1.25733, 
1.25818), Volume = c(2096.8, 2106.2, 2454.7, 2570.3, 2251.6, 
1874.8, 2394, 857.2, 1582.7, 1947.9, 1258.3, 1549.1, 1870.8, 
2165.4, 2287.4, 2469.3, 2244.1, 1915.1, 2440.6, 2274.6, 2167.1, 
2031.3, 2365.1, 979.2, 2642.1)), .Names = c("Time", "Open", "High", 
"Low", "Close", "Volume"), row.names = 529:553, class = "data.frame") 

导入前者为ask.subset和执行

ask.subset$Time$wday 

返回

[1] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 

然后执行以下操作:

ask.subset$Time$hour<-ask.subset$Time$hour+2 

,并再次检查,如果平日已经转移

ask.subset$Time$wday 

这对我来说也没有

[1] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 
+0

这没有任何意义,你能提供一个可重复的例子吗? – 2014-09-01 10:48:28

+0

这对我的欲望来说是完全有意义的。 – Joschka 2014-09-01 11:07:31

+1

我的意思是说,工作日给你错误的结果是毫无意义的... – 2014-09-01 11:10:29

回答

0

在R对话:

a1=as.POSIXlt(strptime("02.01.2004 22:00","%d.%m.%Y %H:%M")); 
a1 
#[1] "2004-01-02 22:00:00 GMT" 
c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday")[a1$wday + 1] 
#[1] "Friday" 
a1$hour<-a1$hour+2 
a1 
#[1] "2004-01-03 00:00:00 GMT" 
c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday")[a1$wday + 1] 
#[1] "Friday" 

但是,

a1=as.POSIXlt(strptime("02.01.2004 22:00","%d.%m.%Y %H:%M")); 
    a1 
    #[1] "2004-01-02 22:00:00 GMT" 
    a2=as.POSIXlt(a1+2*60*60) 
    a2 
    #[1] "2004-01-03 GMT" 
    c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday")[a2$wday + 1] 
    #"Saturday" 

POSIXlt是一个列表,?POSIXlt,无论您如何“添加小时”,它都没有完全反映在其他列表对象中,例如as.POSIXlt强制实施。

+1

非常感谢。这就是诀窍!我不知道'POSIXlt'是如何在内部结构化的。 – Joschka 2014-09-01 11:32:57

0

您也可以使用lubridate中的update函数执行此操作。

假设d是数据,我们可以用它hour()功能结合使用updatehours参数...

> library(lubridate) 
> update(d$Time, hours = hour(d$Time)-2) 
# [1] "2004-01-01 20:00:00 CET" "2004-01-01 20:05:00 CET" 
# [3] "2004-01-01 20:10:00 CET" "2004-01-01 20:15:00 CET" 
# [5] "2004-01-01 20:20:00 CET" "2004-01-01 20:25:00 CET" 
# ... 
# ... 
> u <- update(d$Time, hours = hour(d$Time)-2) 
> difftime(d$Time, u) 
# Time differences in hours 
# [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 

这是我第一次用这个update功能,它看起来就像一个非常简单的方法来改变你的日期时间。

+0

也许有一天我会回到这个解决方案,因为它似乎比Rusan的答案更通用。但是现在具有基本'R'的代码充分满足了我的任务。无论如何,谢谢你,理查德。 – Joschka 2014-09-01 13:32:38

+0

呃...是的,我真的把你的数据读入R,这似乎很好。 – 2014-09-01 13:36:48

相关问题