Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Keep values in between a range (dates and times)

    Hello everyone,
    I am quite new to stata so I would really appreciate your help.
    I have date-time variables which I converted from string and they are in this form:
    09jan2013 13:43:18 (together in one cell).
    I would like to keep variables from the same day but in a specific time range e.g. all the variables on 09jan2013 in the range of 19:00:00 to 19:30:00.
    Thank you in advance,
    Tim
    Last edited by Tim Fattouh; 14 Apr 2020, 05:39.

  • #2
    Maybe this example will point you in the right direction.
    Code:
    . clear
    
    . input str20 datetime_str
    
                 datetime_str
      1. "09jan2013 13:43:18" 
      2. "09jan2013 19:23:18"
      3. "09jan2013 19:30:00"
      4. "09jan2013 19:30:01"
      5. "10jan2013 13:43:18" 
      6. "10jan2013 19:23:18"
      7. "10jan2013 19:30:00"
      8. "10jan2013 19:30:01"
      9. end
    
    . 
    . gen double datetime_num = clock(datetime_str, "DMY hms")
    
    . gen date = dofc(datetime_num)
    
    . gen time = hh(datetime_num) + mm(datetime_num) / 60 + ss(datetime_num) / 3600
    
    . 
    . format datetime_num %tc
    
    . format date %td
    
    . list, sepby(date)
    
         +----------------------------------------------------------------+
         |       datetime_str         datetime_num        date       time |
         |----------------------------------------------------------------|
      1. | 09jan2013 13:43:18   09jan2013 13:43:18   09jan2013   13.72167 |
      2. | 09jan2013 19:23:18   09jan2013 19:23:18   09jan2013   19.38833 |
      3. | 09jan2013 19:30:00   09jan2013 19:30:00   09jan2013       19.5 |
      4. | 09jan2013 19:30:01   09jan2013 19:30:01   09jan2013   19.50028 |
         |----------------------------------------------------------------|
      5. | 10jan2013 13:43:18   10jan2013 13:43:18   10jan2013   13.72167 |
      6. | 10jan2013 19:23:18   10jan2013 19:23:18   10jan2013   19.38833 |
      7. | 10jan2013 19:30:00   10jan2013 19:30:00   10jan2013       19.5 |
      8. | 10jan2013 19:30:01   10jan2013 19:30:01   10jan2013   19.50028 |
         +----------------------------------------------------------------+
    
    . 
    . keep if inrange(time, 19, 19.5) & inlist(date, td(09jan2013))
    (6 observations deleted)
    
    . list
    
         +----------------------------------------------------------------+
         |       datetime_str         datetime_num        date       time |
         |----------------------------------------------------------------|
      1. | 09jan2013 19:23:18   09jan2013 19:23:18   09jan2013   19.38833 |
      2. | 09jan2013 19:30:00   09jan2013 19:30:00   09jan2013       19.5 |
         +----------------------------------------------------------------+

    Comment


    • #3
      It worked perfectly !! thank you very much Mr Wakker

      Comment


      • #4
        Building on the technique given by Wouter Wakker in post #2, the following example makes it easier to specify "complicated" times. I present this not as an improvement for the current problem, but rather an extension to the general technique, should someone with a complicated time range find this post at a later date.
        Code:
        . gen double datetime_num = clock(datetime_str, "DMY hms")
        
        . gen date = dofc(datetime_num)
        
        . gen double time = datetime_num-dhms(date,0,0,0)
        
        . format datetime_num %tcHH:MM:SS.sss
        
        . format date %td
        
        . format time %tcHH:MM:SS.sss
        
        . generate keepthis = inrange(time, hms(18,59,59.5), hms(19,30,0.5)) & inlist(date, td(09jan2013))
        
        . list, sepby(date) noobs
        
          +---------------------------------------------------------------------------+
          |         datetime_str   datetime_num        date           time   keepthis |
          |---------------------------------------------------------------------------|
          |   09jan2013 13:43:18   13:43:18.000   09jan2013   13:43:18.000          0 |
          |   09jan2013 18:59:59   18:59:59.000   09jan2013   18:59:59.000          0 |
          | 09jan2013 18:59:59.7   18:59:59.700   09jan2013   18:59:59.700          1 |
          |   09jan2013 19:23:18   19:23:18.000   09jan2013   19:23:18.000          1 |
          |   09jan2013 19:30:00   19:30:00.000   09jan2013   19:30:00.000          1 |
          | 09jan2013 19:30:00.5   19:30:00.500   09jan2013   19:30:00.500          1 |
          |   09jan2013 19:30:01   19:30:01.000   09jan2013   19:30:01.000          0 |
          |---------------------------------------------------------------------------|
          |   10jan2013 13:43:18   13:43:18.000   10jan2013   13:43:18.000          0 |
          |   10jan2013 19:23:18   19:23:18.000   10jan2013   19:23:18.000          0 |
          |   10jan2013 19:30:00   19:30:00.000   10jan2013   19:30:00.000          0 |
          |   10jan2013 19:30:01   19:30:01.000   10jan2013   19:30:01.000          0 |
          +---------------------------------------------------------------------------+

        Comment

        Working...
        X