【问题标题】:How to correctly generate list of UTC timestamps, by hour, between two datetimes Python?如何在两个日期时间 Python 之间按小时正确生成 UTC 时间戳列表?
【发布时间】:2021-02-15 20:01:40
【问题描述】:

我是 Python 新手。经过几天的研究和尝试,我找到了一个不错的解决方案,可以在两个日期之间每小时创建一个时间戳列表。

示例:

import datetime
from datetime import datetime, timedelta

timestamp_format = '%Y-%m-%dT%H:%M:%S%z'

earliest_ts_str = '2020-10-01T15:00:00Z'
earliest_ts_obj = datetime.strptime(earliest_ts_str, timestamp_format)

latest_ts_str = '2020-10-02T00:00:00Z'
latest_ts_obj = datetime.strptime(latest_ts_str, timestamp_format)

num_days = latest_ts_obj - earliest_ts_obj
num_hours = int(round(num_days.total_seconds() / 3600,0))

ts_raw = []
for ts in range(num_hours):
    ts_raw.append(latest_ts_obj - timedelta(hours = ts + 1))

dates_formatted = [d.strftime('%Y-%m-%dT%H:%M:%SZ') for d in ts_raw]

# Need timestamps in ascending order
dates_formatted.reverse()

dates_formatted

这会导致:

['2020-10-01T00:00:00Z',
 '2020-10-01T01:00:00Z',
 '2020-10-01T02:00:00Z',
 '2020-10-01T03:00:00Z',
 '2020-10-01T04:00:00Z',
 '2020-10-01T05:00:00Z',
 '2020-10-01T06:00:00Z',
 '2020-10-01T07:00:00Z',
 '2020-10-01T08:00:00Z',
 '2020-10-01T09:00:00Z',
 '2020-10-01T10:00:00Z',
 '2020-10-01T11:00:00Z',
 '2020-10-01T12:00:00Z',
 '2020-10-01T13:00:00Z',
 '2020-10-01T14:00:00Z',
 '2020-10-01T15:00:00Z',
 '2020-10-01T16:00:00Z',
 '2020-10-01T17:00:00Z',
 '2020-10-01T18:00:00Z',
 '2020-10-01T19:00:00Z',
 '2020-10-01T20:00:00Z',
 '2020-10-01T21:00:00Z',
 '2020-10-01T22:00:00Z',
 '2020-10-01T23:00:00Z']

问题:

  • 如果我将earliest_ts_str 更改为包含分钟,例如earliest_ts_str = '2020-10-01T19:45:00Z',则生成的列表不会相应地增加分钟间隔。

结果:

['2020-10-01T20:00:00Z',
 '2020-10-01T21:00:00Z',
 '2020-10-01T22:00:00Z',
 '2020-10-01T23:00:00Z']

我需要它:

['2020-10-01T20:45:00Z',
 '2020-10-01T21:45:00Z',
 '2020-10-01T22:45:00Z',
 '2020-10-01T23:45:00Z']

感觉问题出在num_daysnum_hours 计算中,但我不知道如何解决。

想法?

【问题讨论】:

  • 修复您的代码。代码中有 3 个 NameErrors - str_formatdates_raw 未定义。在此之前定义不同的名称。最后一行不打印dates_formated
  • 糟糕。对不起。在我发现东西时打开了这篇文章。它进化了。现在清理干净了。

标签: python datetime datediff python-datetime


【解决方案1】:

只是改变

num_hours = num_days.days*24 + num_days.seconds//3600

问题是num_days 只接受整数值,所以如果它不是 24h 的倍数,您将获得下限值(即,对于您的示例,您将获得 0)。因此,为了计算您需要同时使用天数和秒数的小时数。

另外,您可以直接按正确的顺序创建列表,我不确定您是否出于某种原因这样做。

ts_raw.append(earliest_ts_obj + timedelta(hours = ts + 1))

【讨论】:

    【解决方案2】:
    import datetime
    from datetime import datetime, timedelta
    
    timestamp_format = '%Y-%m-%dT%H:%M:%S%z'
    
    earliest_ts_str = '2020-10-01T00:00:00Z'
    ts_obj = datetime.strptime(earliest_ts_str, timestamp_format)
    
    latest_ts_str = '2020-10-02T00:00:00Z'
    latest_ts_obj = datetime.strptime(latest_ts_str, timestamp_format)
    
    ts_raw = []
    while ts_obj <= latest_ts_obj:
        ts_raw.append(ts_obj)
        ts_obj += timedelta(hours=1)
    
    dates_formatted = [d.strftime('%Y-%m-%dT%H:%M:%SZ') for d in ts_raw]
    print(dates_formatted)
    

    编辑:

    这是Maya的示例

    import maya
    
    earliest_ts_str = '2020-10-01T00:00:00Z'
    latest_ts_str = '2020-10-02T00:00:00Z'
    start = maya.MayaDT.from_iso8601(earliest_ts_str)
    end = maya.MayaDT.from_iso8601(latest_ts_str)
    
    # end is not included, so we add 1 second
    my_range = maya.intervals(start=start, end=end.add(seconds=1), interval=60*60)
    dates_formatted = [d.iso8601() for d in my_range]
    print(dates_formatted)
    

    两个输出

    ['2020-10-01T00:00:00Z',
     '2020-10-01T01:00:00Z',
     ... some left out ...
     '2020-10-01T23:00:00Z',
     '2020-10-02T00:00:00Z']
    

    【讨论】:

    • 太棒了@buran。我要研究这个。它简化了很多。谢谢。
    • 还有很多需要改进/重构的地方。我让它尽可能接近你的代码。如果您不介意使用 Maya 等第三方软件包,可以使用方便的功能来生成间隔。
    【解决方案3】:

    如果您不介意使用 3rd 方包,请查看pandas.date_range

    import pandas as pd
    
    earliest, latest = '2020-10-01T15:45:00Z', '2020-10-02T00:00:00Z'
    
    dti = pd.date_range(earliest, latest, freq='H') # just specify hourly frequency...
    l = dti.strftime('%Y-%m-%dT%H:%M:%SZ').to_list()
    print(l)
    # ['2020-10-01T15:45:00Z', '2020-10-01T16:45:00Z', '2020-10-01T17:45:00Z', '2020-10-01T18:45:00Z', '2020-10-01T19:45:00Z', '2020-10-01T20:45:00Z', '2020-10-01T21:45:00Z', '2020-10-01T22:45:00Z', '2020-10-01T23:45:00Z']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 2013-12-04
      • 2023-02-24
      • 1970-01-01
      • 2011-05-02
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多