我这个时间序列数据(我无法输出。因为dput给出了很长的结果,所以在这里复制和粘贴会弄得一团糟) 这些是我的文本文件中的几行:
Time Depths ifc if lat lon
"7814" "2012-03-15 04:45:09-05" 4816 1040 5410 43.213628 -92.27727
"7815" "2012-03-15 04:30:04-05" 4813 1040 5410 43.213628 -92.27727
"7816" "2012-03-15 04:15:14-05" 4807 1040 5410 43.213628 -92.27727
"7817" "2012-03-15 04:00:09-05" 4809 1040 5410 43.213628 -92.27727
"7818" "2012-03-15 03:45:04-05" 4819 1040 5410 43.213628 -92.27727
"7819" "2012-03-15 03:30:15-05" 4816 1040 5410 43.213628 -92.27727
"7820" "2012-02-25 14:45:07-06" 4862 1040 5410 43.213628 -92.27727
"7821" "2012-02-25 14:30:02-06" 4858 1040 5410 43.213628 -92.27727
"7822" "2012-02-25 14:15:13-06" 4852 1040 5410 43.213628 -92.27727
"7823" "2012-02-25 14:00:08-06" 4860 1040 5410 43.213628 -92.27727
"7824" "2012-02-25 13:45:03-06" 4855 1040 5410 43.213628 -92.27727
"7825" "2012-02-25 13:30:13-06" 4869 1040 5410 43.213628 -92.27727
"7826" "2012-02-25 13:15:08-06" 4868 1040 5410 43.213628 -92.27727
"7827" "2012-02-25 13:00:03-06" 4873 1040 5410 43.213628 -92.27727
在这里你可以看到行号旁边的值。 7819是一个跳跃。我希望解决这个问题,使其包含15分钟的连续时间间隔,并且在这些间隔中的深度列为NA,并且在列的其余部分中的值将填充其他行中的常量值。
我试过了this on SO但是没有用。 有人可以帮帮我吗?
答案 0 :(得分:1)
如果我理解你的问题,应该这样做(这假设它不是zoo
对象而data.frame
是t
)。您可能还必须将列索引2更改为1
dates <- as.POSIXct(t[,2])
# remove the seconds from the time stamps
dates <- dates - as.numeric(format(dates,"%S"))
# Create a sequence of dates for the entire time.
all_dates <- seq.POSIXt(from=dates[length(dates)], to=dates[1],by="15 min")
# Put them into a data.frame to make merging easier
all_dates_frame <- data.frame(dates_floor=all_dates)
# create a data.frame of the obsereved values with the floored dates
t_floor <- data.frame(dates_floor=dates, t[,-2])
# merge the observations onto the grid
together <- merge(all_dates_frame, t_floor, all.y="TRUE", all.x="TRUE")
# If you want to replace the floored times with the actual times then find which ones need replacing
replace_time_index <- !is.na(together[,2])
# replace the time stamps
together[replace_time_index, 1] <- t[,2]
答案 1 :(得分:1)
@Jase_提供了一个示例,说明如果您的数据是data.frame
,您将如何执行此操作;但是,您在评论和初次尝试使用dput
时指出这是zoo
类的对象。
这是zoo
解决方案(从概念上借用Jase_的答案)。它使用index
个对象的zoo
属性。
# First, read in your data as a zoo object via "copy and paste"
require(zoo)
t = read.zoo(text=' Time Depths ifc if lat lon
"7814" "2012-03-15 04:45:09-05" 4816 1040 5410 43.213628 -92.27727
"7815" "2012-03-15 04:30:04-05" 4813 1040 5410 43.213628 -92.27727
"7816" "2012-03-15 04:15:14-05" 4807 1040 5410 43.213628 -92.27727
"7817" "2012-03-15 04:00:09-05" 4809 1040 5410 43.213628 -92.27727
"7818" "2012-03-15 03:45:04-05" 4819 1040 5410 43.213628 -92.27727
"7819" "2012-03-15 03:30:15-05" 4816 1040 5410 43.213628 -92.27727
"7820" "2012-02-25 14:45:07-06" 4862 1040 5410 43.213628 -92.27727
"7821" "2012-02-25 14:30:02-06" 4858 1040 5410 43.213628 -92.27727
"7822" "2012-02-25 14:15:13-06" 4852 1040 5410 43.213628 -92.27727
"7823" "2012-02-25 14:00:08-06" 4860 1040 5410 43.213628 -92.27727
"7824" "2012-02-25 13:45:03-06" 4855 1040 5410 43.213628 -92.27727
"7825" "2012-02-25 13:30:13-06" 4869 1040 5410 43.213628 -92.27727
"7826" "2012-02-25 13:15:08-06" 4868 1040 5410 43.213628 -92.27727
"7827" "2012-02-25 13:00:03-06" 4873 1040 5410 43.213628 -92.27727
', tz="")
# Modify your index as per Jase_'s answer
index(t) = index(t) - as.numeric(format(index(t), "%S"))
# Merge with an empty zoo object that has an index
# of all the dates that you need.
t.merged = merge(t, zoo(, seq(from=index(t)[1],
to=index(t)[length(index(t))],
by="15 min")))
让我们看看输出结果如何:
head(t.merged, 10L)
#
# 2012-02-25 13:00:00 4873 1040 5410 43.21363 -92.27727
# 2012-02-25 13:15:00 4868 1040 5410 43.21363 -92.27727
# 2012-02-25 13:30:00 4869 1040 5410 43.21363 -92.27727
# 2012-02-25 13:45:00 4855 1040 5410 43.21363 -92.27727
# 2012-02-25 14:00:00 4860 1040 5410 43.21363 -92.27727
# 2012-02-25 14:15:00 4852 1040 5410 43.21363 -92.27727
# 2012-02-25 14:30:00 4858 1040 5410 43.21363 -92.27727
# 2012-02-25 14:45:00 4862 1040 5410 43.21363 -92.27727
# 2012-02-25 15:00:00 NA NA NA NA NA
# 2012-02-25 15:15:00 NA NA NA NA NA
tail(t.merged, 10L)
#
# 2012-03-15 02:30:00 NA NA NA NA NA
# 2012-03-15 02:45:00 NA NA NA NA NA
# 2012-03-15 03:00:00 NA NA NA NA NA
# 2012-03-15 03:15:00 NA NA NA NA NA
# 2012-03-15 03:30:00 4816 1040 5410 43.21363 -92.27727
# 2012-03-15 03:45:00 4819 1040 5410 43.21363 -92.27727
# 2012-03-15 04:00:00 4809 1040 5410 43.21363 -92.27727
# 2012-03-15 04:15:00 4807 1040 5410 43.21363 -92.27727
# 2012-03-15 04:30:00 4813 1040 5410 43.21363 -92.27727
# 2012-03-15 04:45:00 4816 1040 5410 43.21363 -92.27727
但是,这并不能代替您想要的NA
值。