在MATLAB中计算时间序列数据的周(月)平均值
假设我们在MATLAB R2015b中有在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
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