我正在组合一些数据以使用match()函数从一个非常大的数据框中提取特定的交易日期/时间,并且完全难以理解为什么我的代码无效。请注意,日期和时间列是分开的,这对使用as.POSIXct函数也提出了挑战。请看一下:
这就是数据的来源:
Symbol Date Time Open High Low Close Volume Tick.Count
1 USH94 01/3/1994 7:21 114.4062 114.4375 114.3750 114.4062 0 5
2 USH94 01/3/1994 7:22 114.3750 114.4062 114.3125 114.3750 0 11
3 USH94 01/3/1994 7:23 114.3438 114.3750 114.3125 114.3438 0 7
4 USH94 01/3/1994 7:24 114.3125 114.3125 114.2500 114.2812 0 14
5 USH94 01/3/1994 7:25 114.2500 114.2812 114.2188 114.2188 0 6
6 USH94 01/3/1994 7:26 114.1875 114.2500 114.1875 114.2500 0 13
然后我使用date()和time()函数将列从因子转换为日期和时间值。我还将在这种情况下保存为字符串的秒添加为变量a,并且由于时间的变化我添加了一小时。
US$Time <- times(paste(US$Time,a,sep = ':'))+1/24
US$Date <- dates(as.character(US$Date))
以下是美国现在的样子:
head(US)
Symbol Date Time Open High Low Close Volume Tick.Count
1 USH94 01/03/94 08:21:00 114.4062 114.4375 114.3750 114.4062 0 5
2 USH94 01/03/94 08:22:00 114.3750 114.4062 114.3125 114.3750 0 11
3 USH94 01/03/94 08:23:00 114.3438 114.3750 114.3125 114.3438 0 7
4 USH94 01/03/94 08:24:00 114.3125 114.3125 114.2500 114.2812 0 14
5 USH94 01/03/94 08:25:00 114.2500 114.2812 114.2188 114.2188 0 6
6 USH94 01/03/94 08:26:00 114.1875 114.2500 114.1875 114.2500 0 13
相同。
然后我尝试将日期和时间与paste()函数结合起来
US$TradeDates <- paste(US$Date,US$Time)
head(US)
Symbol Date Time Open High Low Close Volume Tick.Count TradeDates
1 USH94 01/03/94 08:21:00 114.4062 114.4375 114.3750 114.4062 0 5 01/03/94 0.34791667
2 USH94 01/03/94 08:22:00 114.3750 114.4062 114.3125 114.3750 0 11 01/03/94 0.34861111
3 USH94 01/03/94 08:23:00 114.3438 114.3750 114.3125 114.3438 0 7 01/03/94 0.34930556
4 USH94 01/03/94 08:24:00 114.3125 114.3125 114.2500 114.2812 0 14 01/03/94 0.35000000
5 USH94 01/03/94 08:25:00 114.2500 114.2812 114.2188 114.2188 0 6 01/03/94 0.35069444
6 USH94 01/03/94 08:26:00 114.1875 114.2500 114.1875 114.2500 0 13 01/03/94 0.35138889
看到TradeDates列突然有十进制形式的时间......但真正让我感到困惑的是,如果我按元素执行完全相同的函数元素,我会得到所需的结果:
US$TradeDates[1] <- paste(US$Date[1],US$Time[1])
head(US)
Symbol Date Time Open High Low Close Volume Tick.Count TradeDates
1 USH94 01/03/94 08:21:00 114.4062 114.4375 114.3750 114.4062 0 5 01/03/94 08:21:00
2 USH94 01/03/94 08:22:00 114.3750 114.4062 114.3125 114.3750 0 11 01/03/94 0.34861111
3 USH94 01/03/94 08:23:00 114.3438 114.3750 114.3125 114.3438 0 7 01/03/94 0.34930556
4 USH94 01/03/94 08:24:00 114.3125 114.3125 114.2500 114.2812 0 14 01/03/94 0.35000000
5 USH94 01/03/94 08:25:00 114.2500 114.2812 114.2188 114.2188 0 6 01/03/94 0.35069444
6 USH94 01/03/94 08:26:00 114.1875 114.2500 114.1875 114.2500 0 13 01/03/94 0.35138889
请注意,最后一列中的第一行正是我想要的,但所有其他行仍然是十进制形式。如果这是一个可管理的数据集,我只会使用一个循环,但这实际上是数十亿行,而R根本无法处理该循环。
有什么想法吗?
答案 0 :(得分:1)
你应该使用POSIX格式,它会让你的生活更轻松。
您可以使用
将Date
列转换为POSIXlt
as.POSIXlt(as.character(US$Date), format="%d/%m/%Y")
然后,只需在几秒钟内添加Time
列,POSIXlt
格式即可处理其余内容。