【问题标题】:Can I create a POSIXct data.frame for a day, in minute units, for that day, each year, over 28 years?我可以创建一个 POSIXct data.frame 一天,以分钟为单位,为那一天,每年,超过 28 年?
【发布时间】:2015-01-22 08:50:21
【问题描述】:

我是 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') 

我要做的下一个阶段是为圣诞假期和新年假期创建数据框。然后我将这些 data.frames 与数据进行比较并删除任何匹配项,它遵循与上述完全相同的过程,只是日期和时间数据帧属于圣诞节和新年期间。

我这里的问题是我拥有的数据集超过 28 年。我需要重复上述过程 56 次才能得到想要的结果。

问题

  • as.POSIXct 函数/结构中是否有某些内容允许我指定我想要从 X 到 Y 每年的日期和时间(按分钟、那天)。或者我必须手动执行此操作吗?
  • 有没有人能优雅地解决这个问题?

【问题讨论】:

    标签: r datetime posixct


    【解决方案1】:

    从技术上讲,每天有 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),它可以提供更优雅的解决方案,但要求您能够熟练地操作列表对象。

    【讨论】:

      【解决方案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"]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        相关资源
        最近更新 更多