繁体   English   中英

R如何仅使用月份和日期信息选择150天

[英]R how to select 150 days with only month and day information

当具有“年份”列时,我可以从数据库中选择最近150天,如下所示:

data1 = dbGetQuery(conn_data, statement=paste("SELECT *, STR_TO_DATE(CONCAT(yyyy,'-',mm,'-',dd),'%Y-%m-%d') as dt FROM stations_daily_data", "WHERE STR_TO_DATE(CONCAT(yyyy,'-',mm,'-',dd),'%Y-%m-%d') >= DATE_SUB(CURDATE(), INTERVAL 150 DAY)"))

但是现在所有数据都是迄今为止的平均值,因此只有“月”和“天”列(没有“年”列),这一次我只能选择最后150天。 这是原始1700万行之一的数据帧的简化示例:

df <- data.frame(ID=c(1:5,50001:50005),mm=c(rep(1,5),rep(12,5)),dd=c(1:5,27:31),value=c(21:30))

2月29日可以忽略,因为150天是相当长的一段时间。

我尝试添加列“ year”,以便可以使用上面的代码,但是如果说当前日期是一年的开始,那么对R中的一个大表进行更改会耗尽R的内存,那将是错误的,我对数据库查询不熟悉,是否有可能我可以通过使用查询而不是将表读入R然后在R中的数据帧中进行更改来做到这一点,所以我们将不胜感激!

编辑:因为已经对所有年份进行了平均,所以不再需要“年份”列,这意味着现在5月5日将是每年5月5日的60年平均值。 接下来,我想选择过去150天(平均),我尝试添加“年”列的原因只是想使其更易于选择。

由于我需要每天运行数据,因此如果该日期在6月之后,那么仅使用当前年份会很容易,但是如果是2月,那么它将是当前1年,则可以如果数据要小得多,那么现在完成操作,如果我更改数据框,R会弹出“内存不足”的错误,这就是为什么我想知道是否有一种方法可以在数据库查询或函数中选择R不会花费太多内存,谢谢!

您可以编写一个函数来根据参考年计算年份,并根据截止日期进行调整。 然后,您可以使用order函数根据计算出的年,月和日对data.frame进行排序,而无需在data.frame中插入新的计算年份字段。

但是,由于您仍在对每一行进行排序,因此在1,700万行数据集上的性能将不佳。

# some dummy data (not worrying about illegal dates like Feb 31)
set.seed(123)
da <- data.frame(mm=sample(1:12, 20, replace=T),
                 dd=sample(1:31, 20, replace=T))


# function to calculate year from reference year and cut off month
calc_year <- function(mm_vec, ref_year, cut_month) {
  ref_year + ifelse(mm_vec >= cut_month, 0, -1)
}

# order the data.frame by year, month, and day 
# (taking 2014 as ref. year & assuming months before June are from prior year
da[with(da, order(calc_year(mm_vec=mm, ref_year=2014, cut_month=6), mm, dd)), ]

# if you want just the first 5 rows
da[with(da, order(calc_year(mm_vec=mm, ref_year=2014, cut_month=6), mm, dd)), ][1:5,]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM