Generating 15 minute time interval array in python

前端 未结 6 1567
悲&欢浪女
悲&欢浪女 2020-12-08 10:15

I am trying to generate time interval array. for example:

time_array = [\"2016-09-02T17:30:00Z\", \"2016-09-02T17:45:00Z\", 
              \"2016-09-02T18:00         


        
相关标签:
6条回答
  • 2020-12-08 10:57

    Here's a generic datetime_range for you to use.

    Code

    from datetime import datetime, timedelta
    
    def datetime_range(start, end, delta):
        current = start
        while current < end:
            yield current
            current += delta
    
    dts = [dt.strftime('%Y-%m-%d T%H:%M Z') for dt in 
           datetime_range(datetime(2016, 9, 1, 7), datetime(2016, 9, 1, 9+12), 
           timedelta(minutes=15))]
    
    print(dts)
    

    Output

    ['2016-09-01 T07:00 Z', '2016-09-01 T07:15 Z', '2016-09-01 T07:30 Z', '2016-09-01 T07:45 Z', '2016-09-01 T08:00 Z', '2016-09-01 T08:15 Z', '2016-09-01 T08:30 Z', '2016-09-01 T08:45 Z', '2016-09-01 T09:00 Z', '2016-09-01 T09:15 Z', '2016-09-01 T09:30 Z', '2016-09-01 T09:45 Z' ... ]

    0 讨论(0)
  • 2020-12-08 11:05

    I'll provide a solution that does not handle timezones, since the problem is generating dates and times and you can set the timezone afterwards however you want.

    You have a starting date and starting and ending time (for each day), plus an interval (in minutes) for these datetimes. The idea is to create a timedelta object that represent the time interval and repeatedly update the datetime until we reach the ending time, then we advance by one day and reset the time to the initial one and repeat.

    A simple implementation could be:

    def make_dates(start_date, number_of_days, start_time, end_time, interval, timezone):
        if isinstance(start_date, datetime.datetime):
            start_date = start_date.date()
        start_date = datetime.datetime.combine(start_date, start_time)
        cur_date = start_date
        num_days_passed = 0
        step = datetime.timedelta(seconds=interval*60)
    
        while True:
            new_date = cur_date + step
            if new_date.time() > end_time:
                num_days_passed += 1
                if num_days_passed > number_of_days:
                    break
                new_date = start_date + datetime.timedelta(days=num_days_passed)
            ret_date, cur_date = cur_date, new_date
            yield ret_date
    
    In [31]: generator = make_dates(datetime.datetime.now(), 3, datetime.time(hour=17), datetime.time(hour=19), 15, None)
    
    In [32]: next(generator)
    Out[32]: datetime.datetime(2016, 9, 2, 17, 0)
    
    In [33]: next(generator)
    Out[33]: datetime.datetime(2016, 9, 2, 17, 15)
    
    In [34]: list(generator)
    Out[34]: 
    [datetime.datetime(2016, 9, 2, 17, 30),
     datetime.datetime(2016, 9, 2, 17, 45),
     datetime.datetime(2016, 9, 2, 18, 0),
     datetime.datetime(2016, 9, 2, 18, 15),
     datetime.datetime(2016, 9, 2, 18, 30),
     datetime.datetime(2016, 9, 2, 18, 45),
     datetime.datetime(2016, 9, 2, 19, 0),
     datetime.datetime(2016, 9, 3, 17, 0),
     datetime.datetime(2016, 9, 3, 17, 15),
     datetime.datetime(2016, 9, 3, 17, 30),
     datetime.datetime(2016, 9, 3, 17, 45),
     datetime.datetime(2016, 9, 3, 18, 0),
     datetime.datetime(2016, 9, 3, 18, 15),
     datetime.datetime(2016, 9, 3, 18, 30),
     datetime.datetime(2016, 9, 3, 18, 45),
     datetime.datetime(2016, 9, 3, 19, 0),
     datetime.datetime(2016, 9, 4, 17, 0),
     datetime.datetime(2016, 9, 4, 17, 15),
     datetime.datetime(2016, 9, 4, 17, 30),
     datetime.datetime(2016, 9, 4, 17, 45),
     datetime.datetime(2016, 9, 4, 18, 0),
     datetime.datetime(2016, 9, 4, 18, 15),
     datetime.datetime(2016, 9, 4, 18, 30),
     datetime.datetime(2016, 9, 4, 18, 45),
     datetime.datetime(2016, 9, 4, 19, 0),
     datetime.datetime(2016, 9, 5, 17, 0),
     datetime.datetime(2016, 9, 5, 17, 15),
     datetime.datetime(2016, 9, 5, 17, 30),
     datetime.datetime(2016, 9, 5, 17, 45),
     datetime.datetime(2016, 9, 5, 18, 0),
     datetime.datetime(2016, 9, 5, 18, 15),
     datetime.datetime(2016, 9, 5, 18, 30),
     datetime.datetime(2016, 9, 5, 18, 45)]
    

    Once you have the datetimes you can use the strftime method to convert them to strings.

    0 讨论(0)
  • 2020-12-08 11:06

    This is the final script I have written based on the answers posted on my question:

    from datetime import datetime
    from datetime import timedelta
    import calendar
    
    current_utc = datetime.utcnow().strftime("%Y-%m-%d-%H-%M-%S")
    
    current_year = int(current_utc.split("-")[0])
    current_month = int(current_utc.split("-")[1])
    current_date = int(current_utc.split("-")[2])
    current_hour = int(current_utc.split("-")[3])
    current_min = int(current_utc.split("-")[4])
    current_sec = int(current_utc.split("-")[5])
    
    #### To make minutes round to quarter ####
    min_range_1 = range(1,16)
    min_range_2 = range(16,31)
    min_range_3 = range(31,46)
    min_range_4 = range(46,60)
    
    if current_min in min_range_1:
        current_min = 15
    elif current_min in min_range_2:
        current_min = 30
    elif current_min in min_range_3:
        current_min = 45
    elif current_min in min_range_4:
        current_hour = current_hour + 1
        current_min = 0
    else:
        print("Please check current minute.")
    
    current_sec = 00
    
    date_range_31 = range(1,32)
    date_range_30 = range(1,31)
    
    month_days_31 = [1,3,5,7,8,10,12]
    month_days_30 = [4,6,9,11]
    
    if current_month in month_days_31:
        if current_date == 31:
            next_day_month = current_month + 1
            next_day_date = 1
        else:
            next_day_month = current_month
            next_day_date = current_date
    elif current_month == 2:
        if calendar.isleap(current_year):
            if current_date == 29:
                next_day_month = current_month + 1
                next_day_date = 1
            else:
                next_day_month = current_month
                next_day_date = current_date
        else:
            if current_date == 28:
                next_day_month = current_month + 1
                next_day_date = 1
            else:
                next_day_month = current_month
                next_day_date = current_date
    elif current_month in month_days_30:
        if current_date == 30:
            next_day_month = current_month + 1
            next_day_date = 1
        else:
            next_day_month = current_month
            next_day_date = current_date
    else:
        print("Please check the current month and date to procedd further.")
    
    if current_hour < 11:
        current_hour = 11
        current_min = 15
        next_day_date = current_date + 1
    
    current_start = datetime(current_year,current_month,current_date,current_hour,current_min,current_sec)
    current_end = datetime(current_year,current_month,current_date,21,15,0)
    
    next_day_start = datetime(current_year,next_day_month,next_day_date,11,15,0)
    next_day_end = datetime(current_year,next_day_month,next_day_date,21,15,0)
    
    current_seconds = (current_end - current_start).total_seconds()
    next_day_seconds = (next_day_end - next_day_start).total_seconds()
    
    step = timedelta(minutes=15)
    
    current_day_array = []
    next_day_array = []
    
    for i in range(0, int(current_seconds), int(step.total_seconds())):
        current_day_array.append(current_start + timedelta(seconds=i))
    
    for i in range(0, int(next_day_seconds), int(step.total_seconds())):
        current_day_array.append(next_day_start + timedelta(seconds=i))
    
    current_day_array = [i.strftime('%Y-%m-%dT%H:%M%:%SZ') for i in current_day_array]
    
    print current_day_array
    

    Which produces the following output:

    ['2016-09-03T11:15:00Z', '2016-09-03T11:30:00Z', '2016-09-03T11:45:00Z', '2016-09-03T12:00:00Z', '2016-09-03T12:15:00Z', '2016-09-03T12:30:00Z', '2016-09-03T12:45:00Z', '2016-09-03T13:00:00Z', '2016-09-03T13:15:00Z', '2016-09-03T13:30:00Z', '2016-09-03T13:45:00Z', '2016-09-03T14:00:00Z', '2016-09-03T14:15:00Z', '2016-09-03T14:30:00Z', '2016-09-03T14:45:00Z', '2016-09-03T15:00:00Z', '2016-09-03T15:15:00Z', '2016-09-03T15:30:00Z', '2016-09-03T15:45:00Z', '2016-09-03T16:00:00Z', '2016-09-03T16:15:00Z', '2016-09-03T16:30:00Z', '2016-09-03T16:45:00Z', '2016-09-03T17:00:00Z', '2016-09-03T17:15:00Z', '2016-09-03T17:30:00Z', '2016-09-03T17:45:00Z', '2016-09-03T18:00:00Z', '2016-09-03T18:15:00Z', '2016-09-03T18:30:00Z', '2016-09-03T18:45:00Z', '2016-09-03T19:00:00Z', '2016-09-03T19:15:00Z', '2016-09-03T19:30:00Z', '2016-09-03T19:45:00Z', '2016-09-03T20:00:00Z', '2016-09-03T20:15:00Z', '2016-09-03T20:30:00Z', '2016-09-03T20:45:00Z', '2016-09-03T21:00:00Z', '2016-09-04T11:15:00Z', '2016-09-04T11:30:00Z', '2016-09-04T11:45:00Z', '2016-09-04T12:00:00Z', '2016-09-04T12:15:00Z', '2016-09-04T12:30:00Z', '2016-09-04T12:45:00Z', '2016-09-04T13:00:00Z', '2016-09-04T13:15:00Z', '2016-09-04T13:30:00Z', '2016-09-04T13:45:00Z', '2016-09-04T14:00:00Z', '2016-09-04T14:15:00Z', '2016-09-04T14:30:00Z', '2016-09-04T14:45:00Z', '2016-09-04T15:00:00Z', '2016-09-04T15:15:00Z', '2016-09-04T15:30:00Z', '2016-09-04T15:45:00Z', '2016-09-04T16:00:00Z', '2016-09-04T16:15:00Z', '2016-09-04T16:30:00Z', '2016-09-04T16:45:00Z', '2016-09-04T17:00:00Z', '2016-09-04T17:15:00Z', '2016-09-04T17:30:00Z', '2016-09-04T17:45:00Z', '2016-09-04T18:00:00Z', '2016-09-04T18:15:00Z', '2016-09-04T18:30:00Z', '2016-09-04T18:45:00Z', '2016-09-04T19:00:00Z', '2016-09-04T19:15:00Z', '2016-09-04T19:30:00Z', '2016-09-04T19:45:00Z', '2016-09-04T20:00:00Z', '2016-09-04T20:15:00Z', '2016-09-04T20:30:00Z', '2016-09-04T20:45:00Z', '2016-09-04T21:00:00Z']
    
    0 讨论(0)
  • 2020-12-08 11:09

    Looking at the data file, you should use the built in python date-time objects. followed by strftime to format your dates.

    Broadly you can modify the code below to however many date-times you would like First create a starting date.

    Today= datetime.datetime.today()
    

    Replace 100 with whatever number of time intervals you want.

    date_list = [Today + datetime.timedelta(minutes=15*x) for x in range(0, 100)]
    

    Finally, format the list in the way that you would like, using code like that below.

    datetext=[x.strftime('%Y-%m-%d T%H:%M Z') for x in date_list]
    
    0 讨论(0)
  • 2020-12-08 11:18

    Here is an example using an arbitrary date time

    from datetime import datetime
    
    start = datetime(1900,1,1,0,0,0)
    end = datetime(1900,1,2,0,0,0)
    

    Now you need to get the timedelta (the difference between two dates or times.) between the start and end

    seconds = (end - start).total_seconds()
    

    Define the 15 minutes interval

    from datetime import timedelta
    
    step = timedelta(minutes=15)
    

    Iterate over the range of seconds, with step of time delta of 15 minutes (900 seconds) and sum it to start.

    array = []
    for i in range(0, int(seconds), int(step.total_seconds())):
        array.append(start + timedelta(seconds=i))
    
    print array
    [datetime.datetime(1900, 1, 1, 0, 0),
    datetime.datetime(1900, 1, 1, 0, 15),
    datetime.datetime(1900, 1, 1, 0, 30),
    datetime.datetime(1900, 1, 1, 0, 45),
    datetime.datetime(1900, 1, 1, 1, 0),
    ...
    

    At the end you can format the datetime objects to str representation.

    array = [i.strftime('%Y-%m-%d %H:%M%:%S') for i in array]
    
    print array
    ['1900-01-01 00:00:00',
     '1900-01-01 00:15:00',
     '1900-01-01 00:30:00',
     '1900-01-01 00:45:00',
     '1900-01-01 01:00:00',
    ...
    

    You can format datetime object at first iteration. But it may hurt your eyes

    array.append((start + timedelta(seconds=i)).strftime('%Y-%m-%d %H:%M%:%S'))
    
    0 讨论(0)
  • 2020-12-08 11:20

    Here is a Pandas solution:

    import pandas as pd
    
    l = (pd.DataFrame(columns=['NULL'],
                      index=pd.date_range('2016-09-02T17:30:00Z', '2016-09-04T21:00:00Z',
                                          freq='15T'))
           .between_time('07:00','21:00')
           .index.strftime('%Y-%m-%dT%H:%M:%SZ')
           .tolist()
    )
    

    Output:

    In [165]: l
    Out[165]:
    ['2016-09-02T17:30:00Z',
     '2016-09-02T17:45:00Z',
     '2016-09-02T18:00:00Z',
     '2016-09-02T18:15:00Z',
     '2016-09-02T18:30:00Z',
     '2016-09-02T18:45:00Z',
     '2016-09-02T19:00:00Z',
     '2016-09-02T19:15:00Z',
     '2016-09-02T19:30:00Z',
     '2016-09-02T19:45:00Z',
     '2016-09-02T20:00:00Z',
     '2016-09-02T20:15:00Z',
     '2016-09-02T20:30:00Z',
     '2016-09-02T20:45:00Z',
     '2016-09-02T21:00:00Z',
     '2016-09-03T07:00:00Z',
     '2016-09-03T07:15:00Z',
     '2016-09-03T07:30:00Z',
     '2016-09-03T07:45:00Z',
     '2016-09-03T08:00:00Z',
     '2016-09-03T08:15:00Z',
     '2016-09-03T08:30:00Z',
     '2016-09-03T08:45:00Z',
     '2016-09-03T09:00:00Z',
     '2016-09-03T09:15:00Z',
     '2016-09-03T09:30:00Z',
     '2016-09-03T09:45:00Z',
     '2016-09-03T10:00:00Z',
     '2016-09-03T10:15:00Z',
     '2016-09-03T10:30:00Z',
     '2016-09-03T10:45:00Z',
     '2016-09-03T11:00:00Z',
     '2016-09-03T11:15:00Z',
     '2016-09-03T11:30:00Z',
     '2016-09-03T11:45:00Z',
     '2016-09-03T12:00:00Z',
     '2016-09-03T12:15:00Z',
     '2016-09-03T12:30:00Z',
     '2016-09-03T12:45:00Z',
     '2016-09-03T13:00:00Z',
     '2016-09-03T13:15:00Z',
     '2016-09-03T13:30:00Z',
     '2016-09-03T13:45:00Z',
     '2016-09-03T14:00:00Z',
     '2016-09-03T14:15:00Z',
     '2016-09-03T14:30:00Z',
     '2016-09-03T14:45:00Z',
     '2016-09-03T15:00:00Z',
     '2016-09-03T15:15:00Z',
     '2016-09-03T15:30:00Z',
     '2016-09-03T15:45:00Z',
     '2016-09-03T16:00:00Z',
     '2016-09-03T16:15:00Z',
     '2016-09-03T16:30:00Z',
     '2016-09-03T16:45:00Z',
     '2016-09-03T17:00:00Z',
     '2016-09-03T17:15:00Z',
     '2016-09-03T17:30:00Z',
     '2016-09-03T17:45:00Z',
     '2016-09-03T18:00:00Z',
     '2016-09-03T18:15:00Z',
     '2016-09-03T18:30:00Z',
     '2016-09-03T18:45:00Z',
     '2016-09-03T19:00:00Z',
     '2016-09-03T19:15:00Z',
     '2016-09-03T19:30:00Z',
     '2016-09-03T19:45:00Z',
     '2016-09-03T20:00:00Z',
     '2016-09-03T20:15:00Z',
     '2016-09-03T20:30:00Z',
     '2016-09-03T20:45:00Z',
     '2016-09-03T21:00:00Z',
     '2016-09-04T07:00:00Z',
     '2016-09-04T07:15:00Z',
     '2016-09-04T07:30:00Z',
     '2016-09-04T07:45:00Z',
     '2016-09-04T08:00:00Z',
     '2016-09-04T08:15:00Z',
     '2016-09-04T08:30:00Z',
     '2016-09-04T08:45:00Z',
     '2016-09-04T09:00:00Z',
     '2016-09-04T09:15:00Z',
     '2016-09-04T09:30:00Z',
     '2016-09-04T09:45:00Z',
     '2016-09-04T10:00:00Z',
     '2016-09-04T10:15:00Z',
     '2016-09-04T10:30:00Z',
     '2016-09-04T10:45:00Z',
     '2016-09-04T11:00:00Z',
     '2016-09-04T11:15:00Z',
     '2016-09-04T11:30:00Z',
     '2016-09-04T11:45:00Z',
     '2016-09-04T12:00:00Z',
     '2016-09-04T12:15:00Z',
     '2016-09-04T12:30:00Z',
     '2016-09-04T12:45:00Z',
     '2016-09-04T13:00:00Z',
     '2016-09-04T13:15:00Z',
     '2016-09-04T13:30:00Z',
     '2016-09-04T13:45:00Z',
     '2016-09-04T14:00:00Z',
     '2016-09-04T14:15:00Z',
     '2016-09-04T14:30:00Z',
     '2016-09-04T14:45:00Z',
     '2016-09-04T15:00:00Z',
     '2016-09-04T15:15:00Z',
     '2016-09-04T15:30:00Z',
     '2016-09-04T15:45:00Z',
     '2016-09-04T16:00:00Z',
     '2016-09-04T16:15:00Z',
     '2016-09-04T16:30:00Z',
     '2016-09-04T16:45:00Z',
     '2016-09-04T17:00:00Z',
     '2016-09-04T17:15:00Z',
     '2016-09-04T17:30:00Z',
     '2016-09-04T17:45:00Z',
     '2016-09-04T18:00:00Z',
     '2016-09-04T18:15:00Z',
     '2016-09-04T18:30:00Z',
     '2016-09-04T18:45:00Z',
     '2016-09-04T19:00:00Z',
     '2016-09-04T19:15:00Z',
     '2016-09-04T19:30:00Z',
     '2016-09-04T19:45:00Z',
     '2016-09-04T20:00:00Z',
     '2016-09-04T20:15:00Z',
     '2016-09-04T20:30:00Z',
     '2016-09-04T20:45:00Z',
     '2016-09-04T21:00:00Z']
    
    0 讨论(0)
提交回复
热议问题