在python中生成15分钟的时间间隔数组

Posted

技术标签:

【中文标题】在python中生成15分钟的时间间隔数组【英文标题】:Generating 15 minute time interval array in python 【发布时间】:2017-01-10 21:41:23 【问题描述】:

我正在尝试生成时间间隔数组。例如:

time_array = ["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"]
    它应该在每天晚上 9 点之前的 zulu 时间创建上述元素。 也应该为下一个和后天生成元素 开始时间从早上 7:00 - 晚上 9:00 开始, 如果 current_time > start_time 然后生成 15 分钟的时间间隔数组,直到晚上 9 点。然后生成第二天和第二天+ 2。 并且间隔应该是 7:00, 7:15 这样.. 不是在 7:12, 8:32

【问题讨论】:

到目前为止你忘记展示你的尝试了。 【参考方案1】:

这是一个通用的datetime_range 供您使用。

代码

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)

输出

['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' ... ]

【讨论】:

这个解决方案是正确的 - 但是对于那些想要在 groupby 中使用它的人来说,请注意。由于 datetime_range 函数返回一个生成器,因此只能使用一次。【参考方案2】:

查看数据文件,您应该使用内置的 python 日期时间对象。后跟strftime 格式化您的日期。

您可以将下面的代码修改为您想要的任意多个日期时间 首先创建一个开始日期。

Today= datetime.datetime.today()

将 100 替换为您想要的任意数量的时间间隔。

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

最后,使用如下代码以您想要的方式格式化列表。

datetext=[x.strftime('%Y-%m-%d T%H:%M Z') for x in date_list]

【讨论】:

非常感谢@zhqiat 的回复。我使用了你的一些逻辑来使我的脚本满足要求。【参考方案3】:

这是Pandas 解决方案:

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()
)

输出:

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']

【讨论】:

【参考方案4】:

这是一个使用任意日期时间的示例

from datetime import datetime

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

现在您需要获取startend 之间的时间差(两个日期或时间之间的差异。)

seconds = (end - start).total_seconds()

定义 15 分钟间隔

from datetime import timedelta

step = timedelta(minutes=15)

在秒的范围内迭代,时间增量为 15 分钟(900 秒),并将其与 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),
...

最后,您可以将日期时间对象格式化为 str 表示形式。

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',
...

您可以在第一次迭代时格式化日期时间对象。但它可能会伤害你的眼睛

array.append((start + timedelta(seconds=i)).strftime('%Y-%m-%d %H:%M%:%S'))

【讨论】:

我喜欢这段代码,并根据要求使用您的作品开发我的脚本。谢谢毛罗【参考方案5】:

我将提供一个处理时区的解决方案,因为问题在于生成日期和时间,之后您可以根据需要设置时区。

您有一个开始日期和开始和结束时间(每天),加上这些日期时间的间隔(以分钟为单位)。这个想法是创建一个代表时间间隔的timedelta 对象并重复更新日期时间直到我们到达结束时间,然后我们提前一天并将时间重置为初始时间并重复。

一个简单的实现可能是:

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)]

获得日期时间后,您可以使用strftime 方法将它们转换为字符串。

【讨论】:

谢谢@Bakuriu。我发布了根据发布的答案开发的脚本。【参考方案6】:

这是我根据问题上发布的答案编写的最终脚本:

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

产生以下输出:

['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']

【讨论】:

请注意,*** Markdown 不是 GitHub 风格。所以不要使用三重反引号来引用,只需将所有内容缩进 4 个空格(或者只是粘贴代码,选择它然后按 Ctrl+K 或 按钮)

以上是关于在python中生成15分钟的时间间隔数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中生成数组的排列?

如何使用 numpy 数组在搅拌机中生成网格数组?

在python中生成组合

如何忽略 numpy 数组中的 NaN 数据点并在 Python 中生成规范化数据?

如何在 Matlab 中生成类的实例并将它们保存在数组中?

Javascript - 在单个数组中生成所有元素组合(成对)