按年份子集使用ymd()与年份()的不同结果

时间:2016-10-17 21:10:16

标签: r lubridate

我正在使用包含lubridate的ymd()和year()获得不同的nrows子集,我试图弄清楚可能导致这种差异的原因。

日期为10k的331kb CSV文件为here。指向Google云端硬盘和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()和ymd()计数不同。我创建了一个因子列多年(并巧妙地命名为#34;年&#34;)以加快速度 - 我的数据集有1300万行 - 但与我的问题没有直接关系。我开始时似乎是一个好主意。我做了不同的样本量,差异仍然存在。谢谢!

1 个答案:

答案 0 :(得分:0)

再看一下这个问题:ymd(&#34; 2010-12-31&#34;)是31日凌晨12点而不是12点。
我看到有两种选择可能的解决方案。使用过滤器中的第二天或将所有日期/时间转换为GMT日期。

如果您更改已打开&lt; = ymd(&#34; 2011-1-1&#34;),它将起作用。

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)

我同意时区问题不直观,但它是什么。在测试和捕获原始解决方案中的不一致性方面做得很好。