4

我以前有 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 列的类似数字表示的最佳方法是什么。

4

3 回答 3

3

这里有一些替代方案。他们都使用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.zoo在 zoo 包中使用,ISOdatetime如下所示:

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 
于 2013-06-25T13:47:49.540 回答
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)
于 2013-06-25T13:21:53.123 回答
0

使用parse_date_timeLubridate 包中的函数。

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

文档中的更多信息

编辑 @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"

不知道有没有更干净的方法

于 2013-06-25T11:54:08.343 回答