Resources

Time Series Sequence

0

I would like to create several time sequence where each value is 6 months later than the previous one. For example January 1st, 2010; July 1st, 2010; January 1st, 2011;.....

I have created a loop that does this but I have problems if I start the sequence with July 1st, 2010 for example. Thank you.

Tags: asked April 25, 2013
pvg
2

4 Answers

0

Are you trying to create a vector of dates in dt scalar format? Like this:

my_date =
          20100701
          20110101
          20110701
          20120101

Numbers in this format can be used with the plotTS function and also converted to strings for printing with the dtToStr function like this:

print dtToStr(20100701, "YYYY-MO-DD");

returns:

2010-07-01

or like this:

print dtToStr(20100701, "MO/YYYY");

produces:

07/2010
aptech
342
0

Yes, I'm trying to create a long vector such as "my_date". Any ideas? Thank you.

 

pvg
2
0

The functions that work with dt scalar format treat 20080101 and 200801 both as January 1st, 2008. So if your date will always be the first day of the month you don't have to specify it. Since that is slightly simpler to look at my examples will assume that.

You can put this all on one line (or put it in a procedure so that you don't have to remember the details), but we will go through it in a more verbose fashion to make everything explicit and easy to follow.

  1. Create a vector with the years.
    num_years = 9;
    
    //Create the additive sequence 2006, 2007, 2008...
    dt_vec = seqa(2006, 1, num_years);
    
  2. Create a vector of the same length as your dt_vec date sequence containing the months (i.e. alternating 1 and 7)
    months = { 1, 7 };
    months = reshape(months, num_years, 1);
    
  3. Multiply the years by 10 to make room for the months (i.e. 2006 to 200600)
    dt_vec = dt_vec * 10;
    
  4. Add in the months
    dt_vec = dt_vec + months;
    

Or you could use a more condensed version like this:

num_years = 9;
dt_vec = seqa(2006, 1, num_years) * 10 + reshape(1|7, num_years, 1);

If I was going to do this a lot, I would create a procedure that I could call like this:

dt_vec = seqDate(first_year, month_increment, num_years);

That would be pretty simple to do starting from the code above. The only problem is that it will always start in January and you may not want that. You could either modify the procedure to deal with that, or just use the trimr function to trim off the first few rows that you don't want. Feel free to post if you would like help with something like this.

aptech
342
0

Thank you. That could work.

 

pvg
2