【问题标题】:creating start and end date tuples in list在列表中创建开始和结束日期元组
【发布时间】:2021-11-06 03:52:27
【问题描述】:

我对 python 还很陌生,所以我需要一些帮助。下面的代码完成了工作,但我觉得这不是最有效的方法,任何输入都将不胜感激。

目标:1) 传递字符串开始和结束日期 2) 创建一个列表,以便能够对 API 的请求进行分块。每个结束日期需要在开始日期之后 4 小时 3) 列表中的每个后续开始日期需要在上一个开始日期之后 3 小时 4) 当最终开始日期 >= 结束日期时结束列表

重要的是,最终数字必须显示为“2018-06-05T09 2018-06-05T13”,否则我的 API 请求将不起作用

提前谢谢大家!

from datetime import datetime, timedelta
import numpy as np

start='2018-06-05T00'
end='2020-11-01T23'

start_date = datetime.strptime(start, '%Y-%m-%dT%H')
end_date = datetime.strptime(end, '%Y-%m-%dT%H')

delta = timedelta(hours=3)

end_date_initial = start_date + timedelta(hours=4)

start_date_list = [start_date]
end_date_list = [end_date_initial]

while True:
    start_date += delta
    start_date_list.append(start_date)
    if start_date >= end_date:
        break

while True:
    end_date_initial += delta
    end_date_list.append(end_date_initial)
    if end_date_initial >= end_date:
        break

start_date_array = np.array(start_date_list)
end_date_array = np.array(end_date_list)

formated_start_date = []
formated_end_date = []

for i in range(len(start_date_array)):
    formated_start_date.append(start_date_array[i].strftime('%Y-%m-%dT%H'))

for i in range(len(end_date_array)):
    formated_end_date.append(end_date_array[i].strftime('%Y-%m-%dT%H'))

# print(start_date_array[0], end_date_array[0])
# print(formated_start_date[0], formated_end_date[0])

time = formated_start_date[0] + ' ' + formated_end_date[0]

def listOfTuples(i, j):
    return list(map(lambda x, y:(x + ' ' + y), i, j))

time_tuples = listOfTuples(formated_start_date, formated_end_date)

print(time_tuples[3])

【问题讨论】:

  • 不是低效,但是当循环的最后一行是if...break时,if条件应该是你的循环条件,而不是True
  • Numpy 什么也没给你买。
  • formated_start_date 应该只是一个列表理解

标签: python arrays datetime tuples


【解决方案1】:

如果我理解正确,您可以很容易地做到这一点,并且仍然可以利用 numpy 的矢量化和广播功能:

import numpy as np


ti, tf = np.datetime64("2018-06-05T00"), np.datetime64("2020-11-01T23")

start = np.arange(ti, tf, np.timedelta64(3, "h"))
end = start + np.timedelta64(4, "h")

api_times = [" ".join(map(str, t)) for t in zip(start, end)]

【讨论】:

  • 是的,我主要指的是理解。我找不到一个很好的矢量化方式来加入字符串。
  • 哇,完美运行,1/5 的代码行。我还有很多东西要学,谢谢你给我展示了一些很酷的技巧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2021-11-28
  • 2018-10-16
  • 2021-06-20
  • 1970-01-01
  • 2021-08-22
相关资源
最近更新 更多