以与当前时间戳相当的方式从 UTC 格式的字符串中解析时间
Parse time from string in UTC format in a way comparable with the current time stamp
我想创建一个 pandas 日期范围,范围从已解析时间到当前时间,均采用 UTC。这是我迄今为止的最大努力:
import dateutil
from datetime import datetime, timezone
start_time = dateutil.parser.isoparse ('2021-01-01T00Z')
end_time = datetime.now (timezone.utc)
两个时间戳现在都在 UTC 时区中,但是创建日期范围仍然失败:
> timestamps = pd.date_range (start=start_time, end=end_time, freq='H')
TypeError: Start and end cannot both be tz-aware with different timezones
原因是两个时间戳的 tzinfo 对象都类似于 UTC,但类型不同:
> print (start_time, end_time, type (start_time.tzinfo), type (end_time.tzinfo))
datetime.datetime(2020, 1, 1, 0, 0, tzinfo=tzutc()),
datetime.datetime(2021, 5, 13, 5, 45, 56, 866181, tzinfo=datetime.timezone.utc),
dateutil.tz.tz.tzutc,
datetime.timezone
所以我被困在这里了。有没有有效的方法来做到这一点?这可以通过 'datetime' 解析 UTC 格式的 ISO 时间格式或通过 dateutil 获取 UTC 格式的当前系统时间。我没有找到任何这些的解决方案。
编辑:Copy/paste 代码示例中的错误
我不是专业人士,但我进行了一些研究并使用 astimezone()
:
找到了这个解决方案
import dateutil
from datetime import datetime, timezone
start_time = dateutil.parser.isoparse ('2021-01-01T00Z').astimezone(timezone.utc)
end_time = datetime.now (timezone.utc)
timestamps = pd.date_range (start=start_time, end=end_time, freq='H')
timestamps
给出:
DatetimeIndex(['2021-01-01 00:00:00+00:00', '2021-01-01 01:00:00+00:00',
'2021-01-01 02:00:00+00:00', '2021-01-01 03:00:00+00:00',
'2021-01-01 04:00:00+00:00', '2021-01-01 05:00:00+00:00',
'2021-01-01 06:00:00+00:00', '2021-01-01 07:00:00+00:00',
'2021-01-01 08:00:00+00:00', '2021-01-01 09:00:00+00:00',
...
'2021-05-12 21:00:00+00:00', '2021-05-12 22:00:00+00:00',
'2021-05-12 23:00:00+00:00', '2021-05-13 00:00:00+00:00',
'2021-05-13 01:00:00+00:00', '2021-05-13 02:00:00+00:00',
'2021-05-13 03:00:00+00:00', '2021-05-13 04:00:00+00:00',
'2021-05-13 05:00:00+00:00', '2021-05-13 06:00:00+00:00'],
dtype='datetime64[ns, UTC]', length=3175, freq='H')
好的,看到上面评论中的那一丝活力,我明白了!
start_time = dateutil.parser.isoparse ('2020-01-01T00Z').astimezone (timezone.utc)
end_time = datetime.now (timezone.utc)
pd.date_range (start=start_time, end=end_time, freq='D')
这里的秘密成分是解析字符串中的 'Z' 修饰符,它标记为 UTC 时间。然后, 'astimezone (timezone.utc)' 只改变时区标签,但不转换时间戳值。有效!
非常感谢您的帮助!
我想创建一个 pandas 日期范围,范围从已解析时间到当前时间,均采用 UTC。这是我迄今为止的最大努力:
import dateutil
from datetime import datetime, timezone
start_time = dateutil.parser.isoparse ('2021-01-01T00Z')
end_time = datetime.now (timezone.utc)
两个时间戳现在都在 UTC 时区中,但是创建日期范围仍然失败:
> timestamps = pd.date_range (start=start_time, end=end_time, freq='H')
TypeError: Start and end cannot both be tz-aware with different timezones
原因是两个时间戳的 tzinfo 对象都类似于 UTC,但类型不同:
> print (start_time, end_time, type (start_time.tzinfo), type (end_time.tzinfo))
datetime.datetime(2020, 1, 1, 0, 0, tzinfo=tzutc()),
datetime.datetime(2021, 5, 13, 5, 45, 56, 866181, tzinfo=datetime.timezone.utc),
dateutil.tz.tz.tzutc,
datetime.timezone
所以我被困在这里了。有没有有效的方法来做到这一点?这可以通过 'datetime' 解析 UTC 格式的 ISO 时间格式或通过 dateutil 获取 UTC 格式的当前系统时间。我没有找到任何这些的解决方案。
编辑:Copy/paste 代码示例中的错误
我不是专业人士,但我进行了一些研究并使用 astimezone()
:
import dateutil
from datetime import datetime, timezone
start_time = dateutil.parser.isoparse ('2021-01-01T00Z').astimezone(timezone.utc)
end_time = datetime.now (timezone.utc)
timestamps = pd.date_range (start=start_time, end=end_time, freq='H')
timestamps
给出:
DatetimeIndex(['2021-01-01 00:00:00+00:00', '2021-01-01 01:00:00+00:00',
'2021-01-01 02:00:00+00:00', '2021-01-01 03:00:00+00:00',
'2021-01-01 04:00:00+00:00', '2021-01-01 05:00:00+00:00',
'2021-01-01 06:00:00+00:00', '2021-01-01 07:00:00+00:00',
'2021-01-01 08:00:00+00:00', '2021-01-01 09:00:00+00:00',
...
'2021-05-12 21:00:00+00:00', '2021-05-12 22:00:00+00:00',
'2021-05-12 23:00:00+00:00', '2021-05-13 00:00:00+00:00',
'2021-05-13 01:00:00+00:00', '2021-05-13 02:00:00+00:00',
'2021-05-13 03:00:00+00:00', '2021-05-13 04:00:00+00:00',
'2021-05-13 05:00:00+00:00', '2021-05-13 06:00:00+00:00'],
dtype='datetime64[ns, UTC]', length=3175, freq='H')
好的,看到上面评论中的那一丝活力,我明白了!
start_time = dateutil.parser.isoparse ('2020-01-01T00Z').astimezone (timezone.utc)
end_time = datetime.now (timezone.utc)
pd.date_range (start=start_time, end=end_time, freq='D')
这里的秘密成分是解析字符串中的 'Z' 修饰符,它标记为 UTC 时间。然后, 'astimezone (timezone.utc)' 只改变时区标签,但不转换时间戳值。有效!
非常感谢您的帮助!