如何使用R将日常(每日)数据转换为月度数据?

时间:2015-08-08 15:57:06

标签: r datetime

我有从01-01-2000到01-01-2015的15年利率的日数据。 我想将此数据转换为月度数据,只有月份和年份。

我想取一个月内所有日子的价值,并将其作为该月的一个值。 我怎么能在R。

中这样做
<h1>YZhdan</h1>
<h2><b>How to find me:</b></h2>
<br />
<iframe width="450" height="350" src="https://www.google.com.ua/maps?q=...&amp;output=embed" style="margin-top: 30px;">
</iframe>
<p><b>&#169; Yevhenii Zhdan</b>
</p>

3 个答案:

答案 0 :(得分:2)

使用dplyrlubridate

完成此操作的小例子
set.seed(321)
dat <- data.frame(day=seq.Date(as.Date("2010-01-01"), length.out=200, by="day"), 
       x = rnorm(200), 
       y = rexp(200))
head(dat)

         day          x         y
1 2010-01-01  1.7049032 2.6286754
2 2010-01-02 -0.7120386 0.3916089
3 2010-01-03 -0.2779849 0.1815379
4 2010-01-04 -0.1196490 0.1234461
5 2010-01-05 -0.1239606 2.2237404
6 2010-01-06  0.2681838 0.3217511

require(dplyr)
require(lubridate)
dat %>%
  mutate(year = year(day), 
         monthnum = month(day),
         month = month(day, label=T)) %>%
  group_by(year, month) %>%
  arrange(year, monthnum) %>%
  select(-monthnum) %>%
  summarise(x = mean(x), 
            y = mean(y))

 Source: local data frame [7 x 4]
 Groups: year

  year month           x         y
1 2010   Jan  0.02958633 0.9387509
2 2010   Feb  0.07711820 1.0985411
3 2010   Mar -0.06429982 1.2395438
4 2010   Apr -0.01787658 1.3627864
5 2010   May  0.19131861 1.1802712
6 2010   Jun -0.04894075 0.8224855
7 2010   Jul -0.22410057 1.1749863

答案 1 :(得分:2)

我用xts执行此操作:

set.seed(21)
mibid <- data.frame(Date=Sys.Date()-100:1,
  BID=rnorm(100, 8, 0.1), I.S=rnorm(100, 0.08, 0.01),
  BOR=rnorm(100, 9, 0.1), R.S=rnorm(100, 0.08, 0.01))
require(xts)
# convert to xts
xmibid <- xts(mibid[,-1], mibid[,1])
# aggregate
agg_xmibid <- apply.monthly(xmibid, colMeans)
# convert back to data.frame
agg_mibid <- data.frame(Date=index(agg_xmibid), agg_xmibid, row.names=NULL)
head(agg_mibid)
#         Date      BID        I.S      BOR        R.S
# 1 2015-04-30 8.079301 0.07189111 9.074807 0.06819096
# 2 2015-05-31 7.987479 0.07888328 8.999055 0.08090253
# 3 2015-06-30 8.043845 0.07885779 9.018338 0.07847999
# 4 2015-07-31 7.990822 0.07799489 8.980492 0.08162038
# 5 2015-08-07 8.000414 0.08535749 9.044867 0.07755017

答案 2 :(得分:2)

另一个选择是使用data.table,它有几个非常方便的日期时间函数。使用@SamThomas的数据:

library(data.table)
setDT(dat)[, lapply(.SD, mean), by=.(year(day), month(day))]

这给出了:

   year month           x         y
1: 2010     1  0.02958633 0.9387509
2: 2010     2  0.07711820 1.0985411
3: 2010     3 -0.06429982 1.2395438
4: 2010     4 -0.01787658 1.3627864
5: 2010     5  0.19131861 1.1802712
6: 2010     6 -0.04894075 0.8224855
7: 2010     7 -0.22410057 1.1749863

关于@JoshuaUlrich的数据:

setDT(mibid)[, lapply(.SD, mean), by=.(year(Date), month(Date))]

给出:

   year month      BID        I.S      BOR        R.S
1: 2015     5 7.997178 0.07794925 8.999625 0.08062426
2: 2015     6 8.034805 0.07940600 9.019823 0.07823314
3: 2015     7 7.989371 0.07822263 8.996015 0.08195401
4: 2015     8 8.010541 0.08364351 8.982793 0.07748399

如果您想要月份名称而不是数字,则必须在[, day:=as.IDate(day)]部分后加setDT()并使用months代替month

setDT(mibid)[, Date:=as.IDate(Date)][, lapply(.SD, mean), by=.(year(Date), months(Date))]

注意:特别是在较大的数据集上,data.table可能(很多)比其他两个解决方案更快。