Matlab,我怎么能给一周的数字不仅仅是一年?

时间:2016-08-22 13:31:10

标签: matlab

我从1983年到2010年有5分钟频率的S& P500数据。 给定矩阵作为[日期时间价格返回]被激活。 日期和时间的更多细节描述如下: 数据:yyyymmdd 时间:hhmm

enter image description here

我想按周编号对给定数据进行排序。 更具体地说,我想标记每列的周数。 我知道'weeknum'功能,但只是使用该功能有两个问题 实现我的目的。 一,它返回一年中的周数。因此,1986.12.31标记为53,而1987.1.1标记为1,尽管两天属于同一周。 二,我想累积基于周的标签。如果1986.12.31标记为53,1987.1.1需要标记为105。

2 个答案:

答案 0 :(得分:0)

假设任意开始日期为1/1/1983(假设您使用的是datetime变量),则需要在weekn周围编写一个包装器来处理1月1-4场景的边缘情况。

最糟糕的情况是,1月第一周的大部分时间可能是前一年的交易周,如果12月31日周一下跌,1月1日到4月是周二到周五(尽管新年是一天) S& P的交易假期。再假设1月1日是星期一,这是一个新的一周,你想要做的快速而肮脏的例子如下所示

function weekcounter=edgecases(dateinput)
    if (month(dateinput)==1 & (day(dateinput)<4)) % only care about those first 4 days in January, otherwise weeknum works as advertised.
        if 2<weekday(dateinput)&& weekday(dateinput)<7        
            weekcounter= weeknum(dateshift(dateinput-calmonths(1),'end','month')) % make sure this matches the last day of the previous month
        end
    else
       weekcounter=weeknum(dateinput)
    end
end 

测试代码显示以下

>> edgecases(datetime([1986 1 1]))

ans =

    53

>> edgecases(datetime([1986 1 4]))

ans =

     1

>> edgecases(datetime([1986 1 3]))

ans =

    53
>> edgecases(datetime([1987 1 3]))

ans =

     1

>> edgecases(datetime([1987 1 2]))

ans =

    53

计算完给定的周数后,请执行@Trogdor建议的累积周数。

当然,这也预先假定你的日期变量已经删除了交易假期等。

答案 1 :(得分:0)

如果inputdates是日期时间向量:

previousSundays = dateshift(inputdates,'dayofweek','Sunday','previous');
weekCount = findgroups(previousSundays);  % a vector of same size as inputdates