13

我有一个数据文件,其中包含三列:

20010101 000000  0.833
20010101 000500  0.814
20010101 001000  0.794
20010101 001500  0.772
...

人眼很清楚,前两个是日期和时间。我需要将它们转换为 POSIXct(或者其他更好的东西,但我过去在 R 中处理时间戳的有限经验是使用 POSIXct)。通常,使用 read.table 将其拉入后,我会使用:

df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S")

但是,第二列似乎丢失了前导零(可能是通过类型强制?),因此它不能正常工作。

我已经查看了将日期作为整数和时间作为 R中POSIXct 的因子并将两列日期和时间数据转换为一列,但两者都使用带分隔符的时间,例如:,因此没有相同的问题。

请问如何将这些列转换为 POSIXct?

4

3 回答 3

17

你非常亲近。以下“简单”强制将前两列作为字符串读取,从而保存前导零。

R> df <- read.table(text="20010101 000000  0.833
20010101 000500  0.814
20010101 001000  0.794
20010101 001500  0.772", 
+ header=FALSE, colClasses=c("character", "character", "numeric"), 
+ col.names=c("Date", "Time", "Val"))
R> df
      Date   Time   Val
1 20010101 000000 0.833
2 20010101 000500 0.814
3 20010101 001000 0.794
4 20010101 001500 0.772

现在你正在尝试“正常工作”:

R> df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S")
R> df
      Date   Time   Val            DateTime
1 20010101 000000 0.833 2001-01-01 00:00:00
2 20010101 000500 0.814 2001-01-01 00:05:00
3 20010101 001000 0.794 2001-01-01 00:10:00
4 20010101 001500 0.772 2001-01-01 00:15:00
R> 
于 2013-04-30T13:36:26.807 回答
3

您只需要将数据作为字符导入:

txt <- "Date  Time  value
20010101 000000  0.833
20010101 000500  0.814
20010101 001000  0.794
20010101 001500  0.772
"

df <- read.table(text=txt, header=TRUE, 
                 colClasses=c("character", "character", "numeric"))

df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S")
于 2013-04-30T13:40:10.713 回答
1

只需您可以使用超级棒且快速的 lubridate 包。为了你的目的,试试这个:

df <- read.table(text="20010101 000000  0.833
20010101 000500  0.814
20010101 001000  0.794
20010101 001500  0.772", 
                  header=FALSE, colClasses=c("character", "character",     "numeric"), 
                  col.names=c("Date", "Time", "Val"))

df$mix <- paste(df$Date, df$Time)
df$mix <- parse_date_time(df$mix, 'Ymd HMS')

只是您必须为其提供正确的格式。我更喜欢它,as.POSICct 因为它更灵活,而且您还有其他函数可以处理时间变量。

于 2015-08-17T14:44:51.040 回答