R如何选择150天只有月和日信息

时间:2014-12-16 20:34:14

标签: mysql database r

我可以从数据库中选择最近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中的功能不会花费太多内存,谢谢!

1 个答案:

答案 0 :(得分:0)

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

在1700万行数据集上不会有很好的表现,因为你还在订购每一行。

# 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,]