na.approx函数无法生成正确的时间戳

na.approx函数无法生成正确的时间戳,r,timestamp,dst,na.approx,R,Timestamp,Dst,Na.approx,我有一个大的电力负荷数据集,由于夏令时的原因,它缺少每年3月最后一个星期日的时间戳。我在下面复制了几行,其中包含丢失的时间戳 structure(list(Date_Time = structure(c(1427569200, 1427572800, 1427576400, 1427580000, 1427583600, 1427587200, NA, 1427590800, 1427594400, 1427598000, 1427601600, 1427605200), tzone

我有一个大的电力负荷数据集,由于夏令时的原因,它缺少每年3月最后一个星期日的时间戳。我在下面复制了几行,其中包含丢失的时间戳

    structure(list(Date_Time = structure(c(1427569200, 1427572800, 
1427576400, 1427580000, 1427583600, 1427587200, NA, 1427590800, 
1427594400, 1427598000, 1427601600, 1427605200), tzone = "EET", class = c("POSIXct", 
"POSIXt")), Day_ahead_Load = c("7139", "6598", "6137", "5177", 
"4728", "4628", "N/A", "4426", "4326", "4374", "4546", "4885"
), Actual_Load = c(6541, 6020, 5602, 5084, 4640, 4593, NA, 4353, 
NA, NA, 4333, 4556)), row.names = c(NA, -12L), class = "data.frame")

#>              Date_Time Day_ahead_Load Actual_Load
#> 1  2015-03-28 21:00:00           7139        6541
#> 2  2015-03-28 22:00:00           6598        6020
#> 3  2015-03-28 23:00:00           6137        5602
#> 4  2015-03-29 00:00:00           5177        5084
#> 5  2015-03-29 01:00:00           4728        4640
#> 6  2015-03-29 02:00:00           4628        4593
#> 7                 <NA>            N/A          NA
#> 8  2015-03-29 04:00:00           4426        4353
#> 9  2015-03-29 05:00:00           4326          NA
#> 10 2015-03-29 06:00:00           4374          NA
#> 11 2015-03-29 07:00:00           4546        4333
#> 12 2015-03-29 08:00:00           4885        4556
结构(列表日期时间=结构, 1427576400,1427580000,1427583600,1427587200,北美,1427590800, 142759440014275980001427601601427605200),tzone=“EET”,class=c(“POSIXct”, “POSIXt”)),前一天的负载=c(“7139”、“6598”、“6137”、“5177”, “4728”、“4628”、“不适用”、“4426”、“4326”、“4374”、“4546”、“4885” ),实际荷载=c(6541602056022508446404593,NA,4353, NA,NA,43334556),row.names=c(NA,-12L),class=“data.frame”) #>日期时间日前装载实际装载 #> 1 2015-03-28 21:00:00 7139 6541 #> 2 2015-03-28 22:00:00 6598 6020 #> 3 2015-03-28 23:00:00 6137 5602 #> 4 2015-03-29 00:00:00 5177 5084 #> 5 2015-03-29 01:00:00 4728 4640 #> 6 2015-03-29 02:00:00 4628 4593 #>7不适用 #> 8 2015-03-29 04:00:00 4426 4353 #>9 2015-03-29 05:00:00 4326北美 #>10 2015-03-29 06:00:00 4374北美 #> 11 2015-03-29 07:00:00 4546 4333 #> 12 2015-03-29 08:00:00 4885 4556 我尝试使用na.appro来填充这些丢失的时间戳,但函数返回“2015-03-29 02:30:00”,而不是“2015-03-29 03:00:00”。它没有使用正确的刻度

mydata$Date_Time <- as.POSIXct(na.approx(mydata$Date_Time), origin = "1970-01-01 00:00:00", tz = "EET")

#>              Date_Time Day_ahead_Load Actual_Load
#> 1  2015-03-28 21:00:00           7139        6541
#> 2  2015-03-28 22:00:00           6598        6020
#> 3  2015-03-28 23:00:00           6137        5602
#> 4  2015-03-29 00:00:00           5177        5084
#> 5  2015-03-29 01:00:00           4728        4640
#> 6  2015-03-29 02:00:00           4628        4593
#> 7  2015-03-29 02:30:00            N/A          NA
#> 8  2015-03-29 04:00:00           4426        4353
#> 9  2015-03-29 05:00:00           4326          NA
#> 10 2015-03-29 06:00:00           4374          NA
#> 11 2015-03-29 07:00:00           4546        4333
#> 12 2015-03-29 08:00:00           4885        4556
mydata$Date\u Time Date\u Time Day\u ahead\u Load实际加载
#> 1  2015-03-28 21:00:00           7139        6541
#> 2  2015-03-28 22:00:00           6598        6020
#> 3  2015-03-28 23:00:00           6137        5602
#> 4  2015-03-29 00:00:00           5177        5084
#> 5  2015-03-29 01:00:00           4728        4640
#> 6  2015-03-29 02:00:00           4628        4593
#>7 2015-03-29 02:30:00不适用
#> 8  2015-03-29 04:00:00           4426        4353
#>9 2015-03-29 05:00:00 4326北美
#>10 2015-03-29 06:00:00 4374北美
#> 11 2015-03-29 07:00:00           4546        4333
#> 12 2015-03-29 08:00:00           4885        4556
我也尝试过使用其他一些函数,比如“fill”,但它们都不能正常工作。
由于我对R相当陌生,我非常感谢任何关于填充丢失的时间戳的建议。提前谢谢你。

事实上答案是正确的。由于从标准时间改为夏令时,第六排和第八排之间只有一个小时的时间差

如果您希望两行之间有2小时的间隔,请使用GMT(或等效UTC)。下面我们使用与字符串相同的日期和时间,但将时区更改为GMT以避免夏令时更改

diff(mydata[c(6, 8), 1]) 
## Time difference of 1 hours

# use GMT
tt <- as.POSIXct(format(mydata[[1]]), tz = "GMT")
as.POSIXct(na.approx(tt), tz = "GMT", origin = "1970-01-01")
##  [1] "2015-03-28 21:00:00 GMT" "2015-03-28 22:00:00 GMT"
##  [3] "2015-03-28 23:00:00 GMT" "2015-03-29 00:00:00 GMT"
##  [5] "2015-03-29 01:00:00 GMT" "2015-03-29 02:00:00 GMT"
##  [7] "2015-03-29 03:00:00 GMT" "2015-03-29 04:00:00 GMT"
##  [9] "2015-03-29 05:00:00 GMT" "2015-03-29 06:00:00 GMT"
## [11] "2015-03-29 07:00:00 GMT" "2015-03-29 08:00:00 GMT"
diff(mydata[c(6,8,1)])
##时差为1小时
#使用GMT

tt您可以使用下面的循环,这将确保您始终得到正确的答案,即使您在数据中有许多
NA

library(lubridate)
dat$Date_Time <- as_datetime(as.character(dat$Date_Time))
dat$id <- 1:nrow(dat)
dat$previoustime <- NA
dat$timediff <- NA

for( i in 2:nrow(dat)) {
  previousdateinds <- which(!is.na(dat$Date_Time) & dat$id < i)
  previousdateind <- tail(previousdateinds,1)
  dat$timediff[i] <- i-previousdateind # number of rows between this row and the last non-NA time
  dat$previoustime[i] <- as.character(dat$Date_Time)[previousdateind]
  print(previousdateind)
  }
dat$previoustime <- as_datetime(dat$previoustime)

dat$result <- ifelse(is.na(dat$Date_Time), as.character(dat$previoustime+dat$timediff*60*60), 
                     as.character(dat$Date_Time))
dat[6:8,]
            Date_Time Day_ahead_Load Actual_Load id        previoustime timediff              result
6 2015-03-29 02:00:00           4628        4593  6 2015-03-29 01:00:00        1 2015-03-29 02:00:00
7                <NA>            N/A          NA  7 2015-03-29 02:00:00        1 2015-03-29 03:00:00
8 2015-03-29 04:00:00           4426        4353  8 2015-03-29 02:00:00        2 2015-03-29 04:00:00
库(lubridate)

dat$Date\u时间我不确定我是否理解此解决方案。我还应该注意到,我有47.477行数据。您正在遍历每一行,以找出上一次timedate不是
NA
,并根据上一次
not NA
和此行之间的行数向上一次添加x小时。感谢您为我澄清这一点。您是对的,我不应该这样做“填充”丢失的时间戳,因为该小时没有实际负载。我有一个UTC的天气数据集,我想将负载数据索引到该集,因此我将将负载数据的时区更改为UTC。感谢您的启发!