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

我可以为28年中的某一天,每年,以分钟为单位创建一个POSIXct data.frame吗?,r,datetime,posixct,R,Datetime,Posixct,我是新手,所以我愿意接受任何改进建议 我正在导入一些财务数据并检查丢失的数据。我想到的一种方法是创建一个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')

我是新手,所以我愿意接受任何改进建议

我正在导入一些财务数据并检查丢失的数据。我想到的一种方法是创建一个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开始的每年的日期和时间,以分钟为单位,以当天为单位。或者我必须手动执行此操作? 有人有解决这个问题的好办法吗?
您可以根据需要使用以下类似的方法来创建不同年份的所有日期:

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

names(DateList) <- 1999:2010
例如,要访问2009年的日期,您现在可以使用:

DateList[["2009"]]

您可以根据需要使用以下类似的方法来创建不同年份的所有日期:

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

names(DateList) <- 1999:2010
例如,要访问2009年的日期,您现在可以使用:

DateList[["2009"]]

从技术上讲,每天有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函数系列see?lapply,它可以说提供了一个更优雅的解决方案,但要求您能够自如地操作列表对象。

从技术上讲,每天有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函数族see?lapply,它可以提供一个更优雅的解决方案,但要求您能够自如地操作列表对象