R编程中的datenum等价物

时间:2013-06-25 11:39:12

标签: r

我之前有过matlab的经验,但对R来说很新。我遇到的基本问题是这样的 -

我有一个包含10列的数据。前6列对应于年,月,日,小时和秒。

E.g data_example = 
2013 6 15 11 15 0 ...
2013 6 15 11 20 0 ...
2013 6 15 11 25 0 ...

在matlab中,将日期作为数字处理我曾经使用datenum(data_example(:,1:6))

轻松计算出来

但在R中,获得6列的类似数值表示的最佳方法是什么。

3 个答案:

答案 0 :(得分:2)

以下是一些替代方案。他们都使用ISOdatetime

1)假设DF是您的数据框,请尝试ISOdatetime,如下所示:

DF$datetime <- ISOdatetime(DF[[1]], DF[[2]], DF[[3]], DF[[4]], DF[[5]], DF[[6]])

2)或者像这样:

DF$datetime <- do.call(ISOdatetime, setNames(as.list(DF[1:6]), NULL))

3a)如果这是适合动物园的时间序列(不同的时间和所有数字),那么我们可以在动物园包中使用read.zooISOdatetime这样的:

library(zoo)
z <- read.zoo(DF, index = 1:6, FUN = ISOdatetime)

3b)或使用read.zoo从文件或字符串中读取(后面显示):

# sample input lines
Lines <- "2013 6 15 11 15 0  1
2013 6 15 11 20 0 2
2013 6 15 11 25 0 3
"

library(zoo)
z <- read.zoo(text = Lines, index = 1:6, FUN = ISOdatetime)

给出了这个动物园系列:

> z
2013-06-15 11:15:00 2013-06-15 11:20:00 2013-06-15 11:25:00 
                  1                   2                   3 

答案 1 :(得分:0)

使用Lubridate包中的parse_date_time功能。

x <- paste0(data_example[,1:6])
x <- parse_date_time(x,"%y%m%d %H%M")

documentation

中的更多信息

修改 @joran告诉我测试它,它没有用,所以我做了一些修改:

data_example = data.frame(t(c(13,2,9,14,30)))
x <- paste0(data_example[,1:3],collapse="-")
y <- paste0(data_example[,4:5],collapse=":")
xy<- paste(x,y)
xy <- parse_date_time(xy,"%y%m%d %H%M")
xy
# "2013-02-09 14:30:00 UTC"

我不知道是否有更清洁的方法

答案 2 :(得分:0)

返回值的单位在R中有点不同于Matlab(请参阅代码中的注释)。此外,由于数据框中有其他列,因此首先需要将数据框子集化为仅包含相关的(6)日期列,然后将它们作为新列添加回数据框。

test <- data.frame("year"=c(2013, 2013, 2013, 2001, 1970)
                   , "month"=c(6,6, 6, 4, 1)
                   , "day"=c(15,15, 15, 19, 1)
                   , "hour"=c(11,11, 11, 11, 0)
                   , "min"=c(15,20, 25, 30, 0)
                   , "second"=c(0,0, 0 ,0, 0))
# pad to the right # of digits
dates00 <- apply(test, c(1,2), sprintf, fmt="%02s") 
# combine the date components in each row into a single string
dates0 <- apply(dates00, 1, paste, collapse=" ") 
#format to a date object
dates <- as.POSIXct(dates0, format="%Y %m %d %H %M %S") 
# numbers are seconds since "1970-01-01 00:00:00 UTC"; according 
# to the help file for daynum, Matlab returns the number (from 
# daynum) as fractional days since "January 0, 0000"
as.numeric(dates)