【问题标题】:Combine a column of dates with a column of times using chron package in R使用 R 中的 chron 包将一列日期与一列时间结合起来
【发布时间】:2012-11-21 05:57:29
【问题描述】:

我正在组合一些数据以使用 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 根本无法处理该循环。

有什么想法吗?

【问题讨论】:

  • US$TradeDates &lt;- chron(dates=US$Date, times=US$Time)怎么样

标签: r


【解决方案1】:

您应该以 POSIX 格式工作,这会让您的生活更轻松。

您可以将Date 列转换为POSIXlt 使用

as.POSIXlt(as.character(US$Date), format="%d/%m/%Y")

然后,只需在几秒钟内添加Time 列,POSIXlt 格式将处理其余部分。

【讨论】:

    猜你喜欢
    • 2017-05-16
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2016-06-02
    相关资源
    最近更新 更多