时间序列,将月度数据更改为季度

Posted

技术标签:

【中文标题】时间序列,将月度数据更改为季度【英文标题】:Time series, change monthly data to quarterly 【发布时间】:2014-07-03 03:25:38 【问题描述】:

现在我有一些月度数据,例如:

1/1/90 620
2/1/90,591
3/1/90,574
4/1/90,542
5/1/90,534
6/1/90,545
#...etc

如果我使用 ts() 函数,很容易将数据变成时间序列结构,例如:

         Jan Feb Mar ... Nov Dec
   1990  620 591 574 ... 493 464
   1991  100 200 300 ...........

是否有可能将其更改为这样的季度重复:

            1st 2nd 3rd 4th
   1990-Q1  620 591 574 464
   1990-Q2  100 200 300 400
   1990-Q3  ...
   1990-Q4  ...
   1991-Q1  ...

我试图改变

   ts(mydata,start=c(1990,1),frequency=12)

   ts(mydata,start=c(as.yearqrt("1990-1",1)),frequency=4) 

但它似乎不起作用。

谁能帮帮我?非常感谢。

【问题讨论】:

季度数据意味着您每季度有一个数据点,但在您想要的输出中,您似乎每季度有 4 个数据点? 您是否需要将您的月度数据汇总为季度数据? (即以季度mean 为例) 非常感谢 beginneR、Fernando 和 Rob....我知道我的想法有点特别。我正在尝试您的想法,非常感谢! 【参考方案1】:
 monthly <- ts(mydata, start = c(1990, 1), frequency = 12)
 quarterly <- aggregate(monthly, nfrequency = 4)

【讨论】:

当我尝试这个时,我得到 `Aggregate.zoo(z, nfrequency = 4) 中的错误:缺少参数“by”,没有默认值' 如果有人看到这个答案,为避免您在上述评论中看到的错误,请使用aggregate.ts(monthly, nfrequency = 4) 如果您告诉人们添加平均聚合可能会有所帮助。ts(ts(na.omit(lacondos[,variable_of_interest,drop=FALSE]),frequency=fresult),mean, nfrequency = 4) 【参考方案2】:

我不同意海德曼的观点。这很少见,因为海德曼通常不会做错事。但是,我可以向您展示他的解决方案并没有给 OP 他想要的东西。

test<-c(1:100)
test_ts <- ts(test, start=c(2000,1), frequency=12)
test_ts

     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2000   1   2   3   4   5   6   7   8   9  10  11  12
2001  13  14  15  16  17  18  19  20  21  22  23  24
2002  25  26  27  28  29  30  31  32  33  34  35  36
2003  37  38  39  40  41  42  43  44  45  46  47  48
2004  49  50  51  52  53  54  55  56  57  58  59  60
2005  61  62  63  64  65  66  67  68  69  70  71  72
2006  73  74  75  76  77  78  79  80  81  82  83  84
2007  85  86  87  88  89  90  91  92  93  94  95  96
2008  97  98  99 100     

test_agg <-  aggregate(test_ts, nfrequency=4)
test_agg

2000    6   15   24   33
2001   42   51   60   69
2002   78   87   96  105
2003  114  123  132  141
2004  150  159  168  177
2005  186  195  204  213
2006  222  231  240  249
2007  258  267  276  285
2008  294

嗯,等等,第一季度不是 3 个月的平均值,而是总和。 (1+2+3 =6,但您希望它显示平均值=2)。所以你需要稍微修改一下。

test_agg <-  aggregate(test_ts, nfrequency=4)/3
# divisor is (old freq)/(new freq) = 12/4 = 3
     Qtr1 Qtr2 Qtr3 Qtr4
2000    2    5    8   11
2001   14   17   20   23
2002   26   29   32   35
2003   38   41   44   47
2004   50   53   56   59
2005   62   65   68   71
2006   74   77   80   83
2007   86   89   92   95
2008   98           

现在显示按季度写入的每月数据的平均值。 除数是这里的诀窍。如果您有每周 (freq=52) 并且想要每季度 (freq=4) 您将除以 52/4=13。

【讨论】:

您可以只设置FUN = "mean" 而不是aggregateing 使用sum 并除以三。 2 年后,我现在使用 library(xls) 和 apply.quarterly(zoo_object, FUN=mean),这样头疼得多了。【参考方案3】:

如果你想要平均值而不是总和,只需添加“平均值”:

quarterly <- aggregate(monthly, nfrequency=4,mean)

【讨论】:

以上是关于时间序列,将月度数据更改为季度的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中将月度数据转换为季度

根据季度定义将月度值相加

mysql按年度季度月度周日统计查询的sql语句

mysql 按年度季度月度周日SQL统计查询

java时间工具类型,格式化时间,最近7天 月初 月末 季度 月度 时间格式化 等等

java 某段时间内遍历出啊所有的年度 季度 月度 日 以及日期