提问人:Qinghuan Li 提问时间:9/21/2023 更新时间:9/21/2023 访问量:63
了解 Python 中的 Unix 时间戳和时区转换
Understanding Unix Timestamps and Time Zone Conversion in Python
问:
我在理解 Python 中的 Unix 时间戳和时区转换时遇到困难。我有一个 UTC 日期时间字符串('2023-09-20T05:04:54')和纬度/经度坐标(多伦多附近)。我需要将此 UTC 时间转换为本地时间并获取两者的 Unix 时间戳,预计 UTC 和多伦多时间之间有 4 小时的时差。但是,两个时间戳看起来相同。
# The input time and lat/lon
utc = '2023-09-20T05:04:54'
latitude = 43.477361
longitude = -80.513589
# Find the time zone according to lat/lon
tf = TimezoneFinder()
local_timezone = tf.timezone_at(lng=longitude, lat=latitude)
local_timezone = ZoneInfo(local_timezone) # Convert string to timezone object
# Make sure the input time (utc) is recognized as UTC time by Python
utc_time = datetime.strptime(utc, '%Y-%m-%dT%H:%M:%S').replace(tzinfo=timezone.utc)
# Convert to local time ('America/Toronto')
local_time = utc_time.replace(tzinfo=timezone.utc).astimezone(local_timezone)
# Print Unix timestamps
local_time.timestamp()
#Out[158]: 1695186294.0
utc_time.timestamp()
#Out[159]: 1695186294.0
UTC 和多伦多时区之间的时间偏移量应为 -4 小时。但是,UTC 和多伦多时间的 Unix 时间戳是相同的。有人可以解释为什么时间戳没有 4 小时的差异吗?
答:
3赞
JHM
9/21/2023
#1
该方法返回一个 unix 时间戳。unix 时间戳是自 1970 年 1 月 1 日 UTC 以来的秒数。因此,无论时区如何,它都将始终返回相同的时间,因为它们都是与 1970 年 1 月 1 日 UTC 的“纪元时间”相同的秒数datetime.timestamp()
您始终可以使用 pytz 库计算 2 个时区的时间偏移量:
from pytz import timezone
import pandas as pd
def tz_diff(date, tz1, tz2):
'''
Returns the difference in hours between timezone1 and timezone2
for a given date.
'''
date = pd.to_datetime(date)
return (tz1.localize(date) -
tz2.localize(date).astimezone(tz1))\
.seconds/3600
评论
0赞
Qinghuan Li
9/21/2023
好的,我明白了,这是时间的长度而不是实际的日期时间。
1赞
FObersteiner
9/21/2023
你为什么使用 pytz 和 pandas?这感觉就像把香肠包在牛排里做另一根香肠;-)例如,dateutil 将为您提供通用解析器和时区处理。但是,为什么还要费心解析和 tz 处理,为什么不让调用方负责并只接受两个可感知的日期时间对象呢?
1赞
FObersteiner
9/21/2023
顺便说一句。 不需要,因为 Timedelta 算术是墙时间算术。.astimezone(tz1)
0赞
Qinghuan Li
9/22/2023
这是我第一次使用 Python 的经验,感谢您建议探索 dateutil 包。我目前正在处理来自全球各个位置的气象站数据,这些数据存储为 CSV 文件。我选择了 pandas 来处理这种数据格式。我的目标是将这个气象站数据与其他基于时间戳的数据集同步,这就是我加入 pytz 的原因。感谢您提供更高效的解决方案!@FObersteiner
1赞
FObersteiner
9/22/2023
@QinghuanLi,如果您仍在使用 pandas,它具有内置日期时间和时区处理所需的所有功能。你可以用熊猫的方法做任何事情;大多数时候不需要普通的 Python datetime、pytz、dateutil 等。
评论