如何使用R将日(日)数据转换为月数据?
我有从2000年1月1日到2015年1月1日的15年利率日数据。 我想把这些数据转换成只有月份和年份的月度数据 我想取一个月内所有天数的平均值,使之成为该月的一个值。 在R怎么做如何使用R将日(日)数据转换为月数据?,r,datetime,R,Datetime,我有从2000年1月1日到2015年1月1日的15年利率日数据。 我想把这些数据转换成只有月份和年份的月度数据 我想取一个月内所有天数的平均值,使之成为该月的一个值。 在R怎么做 > str(mibid) 'data.frame': 4263 obs. of 6 variables: $ Days: int 1 2 3 4 5 6 7 8 9 10 ... $ Date: Date, format: "2000-01-03" "2000-01-04" "2000-01-05"
> str(mibid)
'data.frame': 4263 obs. of 6 variables:
$ Days: int 1 2 3 4 5 6 7 8 9 10 ...
$ Date: Date, format: "2000-01-03" "2000-01-04" "2000-01-05" "2000-01-06" ...
$ BID : num 8.82 8.82 8.88 8.79 8.78 8.8 8.81 8.82 8.86 8.78 ...
$ I.S : num 0.092 0.0819 0.0779 0.0801 0.074 0.0766 0.0628 0.0887 0.0759 0.073 ...
$ BOR : num 9.46 9.5 9.52 9.36 9.33 9.37 9.42 9.39 9.4 9.33 ...
$ R.S : num 0.0822 0.0817 0.0828 0.0732 0.084 0.0919 0.0757 0.0725 0.0719 0.0564 ...
> head(mibid)
Days Date BID I.S BOR R.S
1 1 2000-01-03 8.82 0.0920 9.46 0.0822
2 2 2000-01-04 8.82 0.0819 9.50 0.0817
3 3 2000-01-05 8.88 0.0779 9.52 0.0828
4 4 2000-01-06 8.79 0.0801 9.36 0.0732
5 5 2000-01-07 8.78 0.0740 9.33 0.0840
6 6 2000-01-08 8.80 0.0766 9.37 0.0919
>
使用
dplyr
和lubridate
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
set.seed(321)
dat%
突变(年=年(日),
月=月(日),
月=月(日,标签=T))%>%
分组单位(年、月)%>%
安排(年、月)%>%
选择(-monthnum)%>%
总结(x=平均值(x),
y=平均值(y))
来源:本地数据帧[7 x 4]
组别:年
年份月份x y
2010年1月1日0.02958633 0.9387509
2 2010年2月0.07711820 1.0985411
2010年3月3日-0.06429982 1.2395438
4 2010年4月-0.01787658 1.3627864
5 2010年5月0.19131861.1802712
2010年6月6日-0.04894075 0.8224855
2010年7月7日-0.22410057 1.1749863
一个小示例,说明如何使用dplyr
和lubridate
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
set.seed(321)
dat%
突变(年=年(日),
月=月(日),
月=月(日,标签=T))%>%
分组单位(年、月)%>%
安排(年、月)%>%
选择(-monthnum)%>%
总结(x=平均值(x),
y=平均值(y))
来源:本地数据帧[7 x 4]
组别:年
年份月份x y
2010年1月1日0.02958633 0.9387509
2 2010年2月0.07711820 1.0985411
2010年3月3日-0.06429982 1.2395438
4 2010年4月-0.01787658 1.3627864
5 2010年5月0.19131861.1802712
2010年6月6日-0.04894075 0.8224855
2010年7月7日-0.22410057 1.1749863
我会用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
set.seed(21)
mibid我会用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
set.seed(21)
mibid另一个选项是使用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
如果您想要月份的名称而不是数字,则必须在setDT()
部分之后包含[,day:=as.IDate(day)]
,并使用月份
而不是月份
:
setDT(mibid)[, Date:=as.IDate(Date)][, lapply(.SD, mean), by=.(year(Date), months(Date))]
注意:特别是在较大的数据集上,data.table
可能比其他两种解决方案快(很多)。另一种选择是使用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
如果您想要月份的名称而不是数字,则必须在setDT()
部分之后包含[,day:=as.IDate(day)]
,并使用月份
而不是月份
:
setDT(mibid)[, Date:=as.IDate(Date)][, lapply(.SD, mean), by=.(year(Date), months(Date))]
注意:特别是在较大的数据集上,数据。表
可能比其他两种解决方案快(很多)。非常有用,谢谢!非常有用,谢谢!