按年子集使用 ymd() 与 year() 给出不同的结果
Subsetting by year gives different results using ymd() vs. year()
我在 lubridate 包中使用 ymd() 和 year() 得到不同的 nrows 按年子集,我试图找出可能导致这种差异的原因。
一个包含 10k 个日期的 331kb CSV 文件是 here。 url 指向 Google Drive 和 Dropbox 不断抛出错误,这超出了我的新手技能范围。
require(data.table)
require(lubridate)
teaSet <- fread("../teaSet.csv", na.strings=c("NA","N/A", ""))
teaSet$opened <- ymd_hms(teaSet$opened, tz = "")
teaSet$year <- as.factor(teaSet$year)
ymd2010 <- teaSet[opened >= ymd("2010-01-01") & opened <= ymd("2010-12-31"),]
#1480 obs.
year2010 <- teaSet[year(opened)==2010,]
#1483 obs
summary(teaSet$year)
#2010 2011 2012 2013 2014 2015 2016
#1483 1408 1317 1414 1521 1701 1156
谁能解释一下我错过了什么?我按日期范围进行子集化,然后按 year() 进行子集化,并注意到 year() 和 ymd() 计数不同。我多年来创建了一个因子列(并巧妙地将其命名为 "year")以加快处理速度——我的数据集有 1300 万行——但与我的问题没有直接关系。我开始时似乎是个好主意。我做了不同的样本大小,但不同大小的差异仍然存在。谢谢!
再仔细看看这个问题,它看起来像:ymd("2010-12-31") 是 12:00 31 号上午而不是中午 12 点。
我认为有 2 个选项是可能的解决方案。在过滤器中使用第二天或将所有 date/times 隐藏为 GMT 日期。
如果您更改 opened <= ymd("2011-1-1") 它将起作用。
require(lubridate)
library(data.table)
teaSet <- fread("teaSet.csv", na.strings=c("NA","N/A", ""))
teaSet$opened <- ymd_hms(teaSet$opened, tz = "")
teaSet$year <- as.factor(teaSet$year)
ymd2010 <- teaSet[opened >= ymd("2010-01-01") & opened < ymd("2011-1-1"),]
print(dim(ymd2010))
#a second possible option - not as clean as the prior one
teaSet$opened <- ymd_hms(teaSet$opened, tz = "GMT")
ymd2010_2 <-teaSet[as.Date(opened) >= ymd("2010-01-01") & as.Date(opened) <= ymd("2010-12-31")]
print(dim(ymd2010_2))
year2010 <- teaSet[year(opened)==2010,]
print( dim(year2010 ))
summary(teaSet$year)
我同意时区问题不直观,但事实就是如此。在测试并发现原始解决方案中的不一致方面做得很好。
我在 lubridate 包中使用 ymd() 和 year() 得到不同的 nrows 按年子集,我试图找出可能导致这种差异的原因。
一个包含 10k 个日期的 331kb CSV 文件是 here。 url 指向 Google Drive 和 Dropbox 不断抛出错误,这超出了我的新手技能范围。
require(data.table)
require(lubridate)
teaSet <- fread("../teaSet.csv", na.strings=c("NA","N/A", ""))
teaSet$opened <- ymd_hms(teaSet$opened, tz = "")
teaSet$year <- as.factor(teaSet$year)
ymd2010 <- teaSet[opened >= ymd("2010-01-01") & opened <= ymd("2010-12-31"),]
#1480 obs.
year2010 <- teaSet[year(opened)==2010,]
#1483 obs
summary(teaSet$year)
#2010 2011 2012 2013 2014 2015 2016
#1483 1408 1317 1414 1521 1701 1156
谁能解释一下我错过了什么?我按日期范围进行子集化,然后按 year() 进行子集化,并注意到 year() 和 ymd() 计数不同。我多年来创建了一个因子列(并巧妙地将其命名为 "year")以加快处理速度——我的数据集有 1300 万行——但与我的问题没有直接关系。我开始时似乎是个好主意。我做了不同的样本大小,但不同大小的差异仍然存在。谢谢!
再仔细看看这个问题,它看起来像:ymd("2010-12-31") 是 12:00 31 号上午而不是中午 12 点。
我认为有 2 个选项是可能的解决方案。在过滤器中使用第二天或将所有 date/times 隐藏为 GMT 日期。
如果您更改 opened <= ymd("2011-1-1") 它将起作用。
require(lubridate)
library(data.table)
teaSet <- fread("teaSet.csv", na.strings=c("NA","N/A", ""))
teaSet$opened <- ymd_hms(teaSet$opened, tz = "")
teaSet$year <- as.factor(teaSet$year)
ymd2010 <- teaSet[opened >= ymd("2010-01-01") & opened < ymd("2011-1-1"),]
print(dim(ymd2010))
#a second possible option - not as clean as the prior one
teaSet$opened <- ymd_hms(teaSet$opened, tz = "GMT")
ymd2010_2 <-teaSet[as.Date(opened) >= ymd("2010-01-01") & as.Date(opened) <= ymd("2010-12-31")]
print(dim(ymd2010_2))
year2010 <- teaSet[year(opened)==2010,]
print( dim(year2010 ))
summary(teaSet$year)
我同意时区问题不直观,但事实就是如此。在测试并发现原始解决方案中的不一致方面做得很好。