我可以创建一天的POSIXct data.frame,以分钟为单位,每年,每年,超过28年吗?

时间:2014-11-24 15:28:16

标签: r datetime posixct

我是R的新手,对任何改进建议持开放态度。

我导入一些财务数据并检查缺失的数据。我想出这样做的一种方法是创建一个POSIXct向量并将其操作为可比较的格式。请参阅下面的代码;

DateTimeC = seq(as.POSIXct("1986/12/1"), as.POSIXct("1986/12/2"), "mins")   
DateTimeC = format(as.POSIXct(DateTimeC,format='%Y.%m.%d %H:%M'),format='%Y.%m.%d %H:%M')
DateTimeC = data.frame(DateTimeC)
colnames(DateTimeC) = c('DateTime') 

以上创建了我的测试期间所需的列表。然后我将测试与导入进行比较并删除所有匹配项;

DataDelete = DateTimeC[!DateTimeC$DateTime %in% DateTime$DateTime, ] 
DataError = data.frame(DataDelete)
colnames(DataError) = c('DateTime') 

我必须为Xmas Holiday和New Year假期创建数据框架。然后我将这些data.frames与数据进行比较并删除任何匹配项,它遵循与上述完全相同的过程,只有Date,amp;时间数据帧是Xmas&新年期间。

我在这里遇到的问题是我拥有的数据集超过28年。我需要重复上述过程56次以获得所需的结果。

问题

  • as.POSIXct函数/结构中是否有某些内容可以让我指定我希望X-Y每年的日期和时间,分钟,当天。或者我是否必须这样做手动?
  • 有没有人有这个问题的优雅解决方案?

2 个答案:

答案 0 :(得分:3)

从技术上讲,每天有24 * 60 = 1440分钟。 ISO8601标准将00:00定义为新日期的初始时刻。除非您匹配的遗留代码也为感兴趣的时间片分配1441分钟,否则您可能希望调整您的seq()调用。在下文中,我假设这种简化是可以接受的。

首先,您可以更简洁地编写现有代码:

ts  <- seq(as.POSIXct('1986/12/1 00:00'), as.POSIXct('1986/12/1 23:59'), 'mins')
dtc <- data.frame(DateTime=strftime(ts, format='%Y.%m.%d %H:%M'))

请注意,您可以直接在data.frame调用中指定列名:

de  <- data.frame(DateTime=dtc[!dtc$DateTime %in% dt$DateTime,])

如果您希望在几年内自动完成一系列日期,您可以执行以下操作:

for (year in seq(1986,2014))
    for (day in c('1/1','12/1','12/25')) {
        dd  <- paste(year,day,sep='/')
        ts  <- seq(as.POSIXct(paste(dd,'00:00')), as.POSIXlt(paste(dd,'23:59')), 'mins')
        dtc <- data.frame(DateTime=strftime(ts, format='%Y.%m.%d %H:%M'))
        de  <- data.frame(DateTime=dtc[!dtc$DateTime %in% dt$DateTime,])

        ... further processing here ...
}

您可能还想查看* apply系列函数(请参阅?lapply),它可以提供更优雅的解决方案,但需要您轻松操作列表对象。

答案 1 :(得分:2)

您可以使用以下内容根据需要创建不同年份的所有日期:

DateList <- lapply(1999:2010, function(year){ 
                      seq(as.POSIXct(paste0(year, "/12/1")),
                          as.POSIXct(paste0(year, "/12/2")), "mins")})

names(DateList) <- 1999:2010

结果列出了1999年至2010年的日期:

> str(DateList)
List of 12
 $ 1999: POSIXct[1:1441], format: "1999-12-01 00:00:00" "1999-12-01 00:01:00" "1999-12-01 00:02:00" "1999-12-01 00:03:00" ...
 $ 2000: POSIXct[1:1441], format: "2000-12-01 00:00:00" "2000-12-01 00:01:00" "2000-12-01 00:02:00" "2000-12-01 00:03:00" ...
 $ 2001: POSIXct[1:1441], format: "2001-12-01 00:00:00" "2001-12-01 00:01:00" "2001-12-01 00:02:00" "2001-12-01 00:03:00" ...
 $ 2002: POSIXct[1:1441], format: "2002-12-01 00:00:00" "2002-12-01 00:01:00" "2002-12-01 00:02:00" "2002-12-01 00:03:00" ...
 $ 2003: POSIXct[1:1441], format: "2003-12-01 00:00:00" "2003-12-01 00:01:00" "2003-12-01 00:02:00" "2003-12-01 00:03:00" ...
 $ 2004: POSIXct[1:1441], format: "2004-12-01 00:00:00" "2004-12-01 00:01:00" "2004-12-01 00:02:00" "2004-12-01 00:03:00" ...
 $ 2005: POSIXct[1:1441], format: "2005-12-01 00:00:00" "2005-12-01 00:01:00" "2005-12-01 00:02:00" "2005-12-01 00:03:00" ...
 $ 2006: POSIXct[1:1441], format: "2006-12-01 00:00:00" "2006-12-01 00:01:00" "2006-12-01 00:02:00" "2006-12-01 00:03:00" ...
 $ 2007: POSIXct[1:1441], format: "2007-12-01 00:00:00" "2007-12-01 00:01:00" "2007-12-01 00:02:00" "2007-12-01 00:03:00" ...
 $ 2008: POSIXct[1:1441], format: "2008-12-01 00:00:00" "2008-12-01 00:01:00" "2008-12-01 00:02:00" "2008-12-01 00:03:00" ...
 $ 2009: POSIXct[1:1441], format: "2009-12-01 00:00:00" "2009-12-01 00:01:00" "2009-12-01 00:02:00" "2009-12-01 00:03:00" ...
 $ 2010: POSIXct[1:1441], format: "2010-12-01 00:00:00" "2010-12-01 00:01:00" "2010-12-01 00:02:00" "2010-12-01 00:03:00" ...

例如,要访问2009年的日期,您现在可以使用:

DateList[["2009"]]