使用 window() 丢弃时间对大型动物园对象进行子集化
Subsetting a large zoo object using window() drops times
序言:我有一个大型多变动物园对象。它包含几年的 60 分钟间隔数据。我喜欢将我的数据保存在大块中,并在我需要执行工作时从大块中提取子集。通常,我会做一些非常基本的事情,比如制作图表,但我想更深入地了解我的数据。
所以。我正在拿我的大 data.csv 文件 here。并执行以下操作:
library(zoo)
library(lubridate)
df <- read.csv(file.choose(), na.strings = "")
df$FLOW <- as.numeric(df$FLOW) # read.csv turns this row into a factor due to NAs.
df$NST_DATI <- mdy_hm(df$NST_DATI, tz = "UTC")
df.zoo <- read.zoo(df)
假设我想将这个大块子集化为仅来自 2012 年的数据。如果我对 df data.table 进行子集化,我会得到这个(注意时间从 2012-01-01 00:30:00 开始,正如预期的那样):
> head(df[format(df$NST_DATI, "%Y") == 2012, ])
NST_DATI WATER_TEMP PH SPEC_CONDUCT DO PER_SATUR TURBIDITY TDS STAGE FLOW
35065 2012-01-01 00:30:00 0.82 6.48 40.3 13.24 92.5 2.6 0.0258 83.315 587
35066 2012-01-01 01:30:00 0.83 6.48 40.2 13.17 92.1 3.2 0.0257 83.313 585
35067 2012-01-01 02:30:00 0.85 6.44 40.1 13.11 91.8 3.8 0.0256 83.313 585
35068 2012-01-01 03:30:00 0.84 6.48 40.2 13.14 91.9 2.9 0.0257 83.313 585
35069 2012-01-01 04:30:00 0.86 6.48 40.2 13.10 91.7 2.9 0.0257 83.313 585
35070 2012-01-01 05:30:00 0.87 6.48 40.2 13.08 91.5 2.9 0.0257 83.312 583
当我使用 window()
函数进行子集化时,我得到了不同的结果(注意时间从 2012-01-01 03:30:00 开始)。
head(window(df.zoo, start = "2012-01-01", end = "2012-12-31"))
WATER_TEMP PH SPEC_CONDUCT DO PER_SATUR TURBIDITY TDS STAGE FLOW
2012-01-01 03:30:00 0.84 6.48 40.2 13.14 91.9 2.9 0.0257 83.313 585
2012-01-01 04:30:00 0.86 6.48 40.2 13.10 91.7 2.9 0.0257 83.313 585
2012-01-01 05:30:00 0.87 6.48 40.2 13.08 91.5 2.9 0.0257 83.312 583
2012-01-01 06:30:00 0.90 6.48 40.3 13.09 91.7 2.9 0.0258 83.312 583
2012-01-01 07:30:00 0.94 6.49 40.3 13.01 91.3 2.9 0.0258 83.313 585
2012-01-01 08:30:00 0.95 6.46 41.3 12.98 91.1 2.8 0.0264 83.316 588
它真的很磨我的齿轮,因为我也可以在其他年份复制它。感谢您的任何见解!
所以,在函数window()
中,start
和end
变量如果没有指定,将继承你系统的时区。由于 df.zoo
是用 tz = "UTC"
指定的,因此我的计算机的时区介入并强制进行了三个小时的偏移量偏移(UTC 减去我的时区)。
要得到预期的结果,解决方法是:
window(df.zoo, start = as.POSIXct("2012-01-01", tz = "UTC"), end = as.POSIXct("2012-12-31", tz = "UTC")) # specify tz!!!!
C'est la vie...
序言:我有一个大型多变动物园对象。它包含几年的 60 分钟间隔数据。我喜欢将我的数据保存在大块中,并在我需要执行工作时从大块中提取子集。通常,我会做一些非常基本的事情,比如制作图表,但我想更深入地了解我的数据。
所以。我正在拿我的大 data.csv 文件 here。并执行以下操作:
library(zoo)
library(lubridate)
df <- read.csv(file.choose(), na.strings = "")
df$FLOW <- as.numeric(df$FLOW) # read.csv turns this row into a factor due to NAs.
df$NST_DATI <- mdy_hm(df$NST_DATI, tz = "UTC")
df.zoo <- read.zoo(df)
假设我想将这个大块子集化为仅来自 2012 年的数据。如果我对 df data.table 进行子集化,我会得到这个(注意时间从 2012-01-01 00:30:00 开始,正如预期的那样):
> head(df[format(df$NST_DATI, "%Y") == 2012, ])
NST_DATI WATER_TEMP PH SPEC_CONDUCT DO PER_SATUR TURBIDITY TDS STAGE FLOW
35065 2012-01-01 00:30:00 0.82 6.48 40.3 13.24 92.5 2.6 0.0258 83.315 587
35066 2012-01-01 01:30:00 0.83 6.48 40.2 13.17 92.1 3.2 0.0257 83.313 585
35067 2012-01-01 02:30:00 0.85 6.44 40.1 13.11 91.8 3.8 0.0256 83.313 585
35068 2012-01-01 03:30:00 0.84 6.48 40.2 13.14 91.9 2.9 0.0257 83.313 585
35069 2012-01-01 04:30:00 0.86 6.48 40.2 13.10 91.7 2.9 0.0257 83.313 585
35070 2012-01-01 05:30:00 0.87 6.48 40.2 13.08 91.5 2.9 0.0257 83.312 583
当我使用 window()
函数进行子集化时,我得到了不同的结果(注意时间从 2012-01-01 03:30:00 开始)。
head(window(df.zoo, start = "2012-01-01", end = "2012-12-31"))
WATER_TEMP PH SPEC_CONDUCT DO PER_SATUR TURBIDITY TDS STAGE FLOW
2012-01-01 03:30:00 0.84 6.48 40.2 13.14 91.9 2.9 0.0257 83.313 585
2012-01-01 04:30:00 0.86 6.48 40.2 13.10 91.7 2.9 0.0257 83.313 585
2012-01-01 05:30:00 0.87 6.48 40.2 13.08 91.5 2.9 0.0257 83.312 583
2012-01-01 06:30:00 0.90 6.48 40.3 13.09 91.7 2.9 0.0258 83.312 583
2012-01-01 07:30:00 0.94 6.49 40.3 13.01 91.3 2.9 0.0258 83.313 585
2012-01-01 08:30:00 0.95 6.46 41.3 12.98 91.1 2.8 0.0264 83.316 588
它真的很磨我的齿轮,因为我也可以在其他年份复制它。感谢您的任何见解!
所以,在函数window()
中,start
和end
变量如果没有指定,将继承你系统的时区。由于 df.zoo
是用 tz = "UTC"
指定的,因此我的计算机的时区介入并强制进行了三个小时的偏移量偏移(UTC 减去我的时区)。
要得到预期的结果,解决方法是:
window(df.zoo, start = as.POSIXct("2012-01-01", tz = "UTC"), end = as.POSIXct("2012-12-31", tz = "UTC")) # specify tz!!!!
C'est la vie...