在MATLAB中计算时间序列数据的周(月)平均值

在MATLAB中计算时间序列数据的周(月)平均值,matlab,time-series,Matlab,Time Series,假设我们在MATLAB R2015b中有DT_vec: DT_vec = 2008 7 21 0 0 0 2008 7 22 0 0 0 2008 7 23 0 0 0 2008 7 29 0 0 0 2008 8 4 0 0 0 2008 8 12 0 0 0 2008 9 14 0 0 0 2008 9 15 0 0 0 2008

假设我们在MATLAB R2015b中有
DT_vec

DT_vec = 
2008    7   21  0   0   0
2008    7   22  0   0   0
2008    7   23  0   0   0
2008    7   29  0   0   0
2008    8   4   0   0   0
2008    8   12  0   0   0
2008    9   14  0   0   0
2008    9   15  0   0   0
2008    9   16  0   0   0
2008    9   17  0   0   0
2008    9   20  0   0   0
2008    9   21  0   0   0
存储在My_数据中的数据:

32
43
12
43
2
12
54
32
34
5
32
12

我希望计算此时间序列的每周(或每月)平均值(
My_data
)。我该怎么做?

每月一次比较容易,您可以使用
DT\u vec
中的第一列和第二列来创建所需的
subs
数组

你可以每周做同样的事情,但你必须弄清楚如何获得
subs
。它应该不会复杂得多,但使用日期序列号(即
datenum(DT_vec)
)然后执行类似
subs=floor((datenum(DT_vec)+offset)/7)的操作可能更容易,其中
offset
是一个介于
0
6
之间的整数,用于获取周日开始的数字(或星期一)。然后,您可能希望减去,以使第一周从
1
开始,因此
subs=subs-min(subs)+1

编辑:这是如何工作的,偏移量是多少

这里的想法是将您的日期表示为。从
datenum
的文档中:

datenum函数创建一个数字数组,该数组将每个时间点表示为从10000年1月0日起的天数

因此,来自
datenum
的结果中的每个整数代表一整天。在您的示例
DT_vec
(即
datenum(DT_vec)
)上运行此函数,我们得到:

您的前两次约会是连续的,因此
DT_num(2)-DT_num(1)==1
。那么我们如何计算周数呢?我们需要将这些连续的日期数字分组为7。为此,我将每个数字除以
7
,然后使用
floor
删除小数点。为了使用较小的数字演示这一点,当我们将
0:14
除以
7
时会发生什么情况?我们得到

     0
0.1429
0.2857
0.4286
0.5714
0.7143
0.8571
1.0000
1.1429
1.2857
1.4286
1.5714
1.7143
1.8571
2.0000
如果我们用floor去掉小数,我们得到:

 0
 0
 0
 0
 0
 0
 0
 1
 1
 1
 1
 1
 1
 1
 2
实际数字也会发生同样的情况,它们不会从
0
开始。那么偏移量是什么呢?因为除以
7
后整数的每一个变化都代表一个新的星期,我们需要确保从周日开始划分周,而不是像周四这样的任意一天。因为MATLAB开始计数从0000年1月1日开始,我们需要知道那是一周中的哪一天,然后使用
offset
将其设置为从下一个星期日开始计数。10000年1月1日是哪一天?我们可以使用MATLAB的函数来查找。例如,今天是哪一天

weekday(datenum([2016 03 14]))
返回
2
表示星期一。那么
0
是哪一天?
工作日(0)
返回
6
表示星期五。因此我们需要偏移此计数器,使其从
0
开始,因此
偏移量
应等于
工作日(1)-1

为了进一步说明这一点,考虑过去的14天:

d = (today-7:today)'
现在

返回

ans=

当第二列从
7
变为
1
时,新的一周就开始了,但是您可以看到,在第1列中由
floor(d/7)
创建的分组与此不符。事实上,它在
5
(或
-2
)关闭。这就是我们想要使用
offset
的原因。因此,如果我们设置
offset=weekday(0)-1
然后

[floor((d+offset)/7) weekday(d)]
给予


正确划分周。

每月更容易,您可以使用
DT_vec
中的第一列和第二列来创建

你可以在每周做同样的事情,但你必须解决如何获得
subs
。这应该不会太复杂,但使用日期序列号(即
datenum(DT_vec)
)然后做类似
subs=floor((datenum(DT_vec)+offset)/7的事情可能更容易
其中
offset
是一个介于
0
6
之间的整数,用于获取周日(或周一)开始的数字。然后,您可能需要进行减法,以使第一周从
1
开始,因此
subs=subs-min(subs)+1

编辑:这是如何工作的,偏移量是多少

这里的想法是将您的日期表示为。从
datenum
的文档中:

datenum函数创建一个数字数组,该数组将每个时间点表示为从10000年1月0日起的天数

因此,来自
datenum
的结果中的每个整数代表一整天。在您的示例
DT_vec
(即
datenum(DT_vec)
)上运行此函数,我们得到:

您的前两次约会是连续的,因此
DT_num(2)-DT_num(1)==1
。那么我们如何计算周数呢?我们需要将这些连续的日期数字分组为7。为此,我将每个数字除以
7
,然后使用
floor
删除小数点。为了使用较小的数字演示这一点,当我们将
0:14
除以
7
时会发生什么情况?我们得到

     0
0.1429
0.2857
0.4286
0.5714
0.7143
0.8571
1.0000
1.1429
1.2857
1.4286
1.5714
1.7143
1.8571
2.0000
如果我们用floor去掉小数,我们得到:

 0
 0
 0
 0
 0
 0
 0
 1
 1
 1
 1
 1
 1
 1
 2
实际数字也会发生同样的情况,它们不会从
0
开始。那么偏移量是什么呢?因为除以
7
后整数的每一个变化都代表一个新的星期,我们需要确保从周日开始划分周,而不是像周四这样的任意一天。因为MATLAB开始计数从0000年1月1日开始,我们需要知道那是一周中的哪一天,然后使用
offset
将其设置为从下一个星期日开始计数。10000年1月1日是哪一天?我们可以使用MATLAB的函数来查找。例如,今天是哪一天

weekday(datenum([2016 03 14]))
返回
2
表示星期一。那么,星期几是
0
weekday(0)
返回
6
表示星期五。因此,我们需要偏移此计数器,使其从
0
开始,从而偏移
offset[floor((d+offset)/7) weekday(d)]
  105199           2
  105199           3
  105199           4
  105199           5
  105199           6
  105199           7
  105200           1
  105200           2
  105200           3
  105200           4
  105200           5
  105200           6
  105200           7
  105201           1
  105201           2