了解 Python 中的 Unix 时间戳和时区转换

Understanding Unix Timestamps and Time Zone Conversion in Python

提问人:Qinghuan Li 提问时间:9/21/2023 更新时间:9/21/2023 访问量:63

问:

我在理解 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 小时的差异吗?

日期 时间戳 unix-timestamp python-datetime time-offset

评论

4赞 tkausl 9/21/2023
根据定义,Unix 时间戳是 UTC。
2赞 Mark Ransom 9/21/2023
是的,@tkausl说的。Python 在计算时间戳之前将时间转换为 UTC。
0赞 Qinghuan Li 9/21/2023
好的,我明白了,这是时间的长度而不是实际的日期时间。

答:

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 等。