我正在处理日期时间和时区的向量。一些时区记录不正确,我想调整时间以适应正确的时区。我想输出一个数据框。看来,当将行附加到输出数据帧时,rbind 更改了观察之一中变量之一的值。这是示例代码和显示问题的输出。
toy_problem <- function(){
require("tidyverse")
DateTime <- c("2001-04-06 01:20:00", # Input dates and times
"2001-04-05 19:20:00",
"2001-04-05 16:00:00",
"2001-04-06 01:15:00")
listZones <- c("America/Chicago", # Input time zones
"America/Chicago",
"America/Chicago",
"America/Chicago")
trueZones <- c("America/Detroit", # Correct time zones
"America/Detroit",
"America/Chicago",
"America/Detroit")
# Create an empty data frame
outFrame <- data.frame(inTime=NULL, outTime=NULL)
for (i in 1:4) { # Loop through the observations
tReg <- ymd_hms(DateTime[i], tz=listZones[i]) # Iinput date/time to POSIXct
localTime <- with_tz(tReg,tzone=trueZones[i]) # Fix the time to fit the correct TZ
print(tReg) # Starting date/time
print(localTime) # Adusted date/time adjusted
# Put the observation into a one-line data frame
thisFrame <- data.frame(inTime=tReg, outTime=localTime)
print(str(thisFrame)) # Check the one-line data frame
outFrame <- rbind(outFrame,thisFrame) # Append to the ouput frame
}
print(outFrame) # Print the output data frame
}
这是带注释的输出:
[1] "2001-04-06 01:20:00 CDT"
[1] "2001-04-06 02:20:00 EDT" # Correct
'data.frame': 1 obs. of 2 variables: # Looks good
$ inTime : POSIXct, format: "2001-04-06 01:20:00"
$ outTime: POSIXct, format: "2001-04-06 02:20:00"
NULL
[1] "2001-04-05 19:20:00 CDT"
[1] "2001-04-05 20:20:00 EDT" # Correct
'data.frame': 1 obs. of 2 variables: # Looks good
$ inTime : POSIXct, format: "2001-04-05 19:20:00"
$ outTime: POSIXct, format: "2001-04-05 20:20:00"
NULL
[1] "2001-04-05 16:00:00 CDT"
[1] "2001-04-05 16:00:00 CDT" # Correct!!!!
'data.frame': 1 obs. of 2 variables: # Looks good!!!
$ inTime : POSIXct, format: "2001-04-05 16:00:00"
$ outTime: POSIXct, format: "2001-04-05 16:00:00"
NULL
[1] "2001-04-06 01:15:00 CDT"
[1] "2001-04-06 02:15:00 EDT" # Correct
'data.frame': 1 obs. of 2 variables: # Looks good
$ inTime : POSIXct, format: "2001-04-06 01:15:00"
$ outTime: POSIXct, format: "2001-04-06 02:15:00"
NULL
inTime outTime
1 2001-04-06 01:20:00 2001-04-06 02:20:00 # Correct
2 2001-04-05 19:20:00 2001-04-05 20:20:00 # Correct
3 2001-04-05 16:00:00 2001-04-05 17:00:00 # WRONG!!!!!!
4 2001-04-06 01:15:00 2001-04-06 02:15:00 # Correct
我不明白为什么这个值在附加到输出数据帧时会被更改。
迈克的评论是正确的。 rbind 强制类,因此第一个条目的类被转移到所有其他条目。一个条目被更改的原因是它的类与放入输出数据帧中的第一个条目不同。