NumPy - 时区处理
NumPy 中的时区处理
NumPy 中的时区处理允许您管理跨不同时区的日期时间数据。在处理基于全局时间的数据(例如股票市场时间戳、天气数据或国际事件)时,这一点非常重要,因为为了进行准确的分析,这些数据需要进行时区转换。
虽然 NumPy 不像其他一些库(例如"pytz"或"pandas")那样内置了时区支持,但它允许您使用 datetime 对象,并且您可以使用"pytz"等外部库进行时区转换。
NumPy 的 datetime64 对象是时区无关的,这意味着它们不存储时区信息,但您可以使用兼容工具手动调整它们。
使用"datetime64"处理时区
默认情况下,NumPy 中的"datetime64"对象是时区无关的,这意味着它们不存储时区信息。如果需要明确处理时区,则需要将 NumPy 与 Python 中"datetime"模块中的"pytz"或"timezone"等库结合使用。
要转换时区或处理可感知时区的日期时间数据,您可以将外部工具与 NumPy 数组结合使用,以管理跨时区的日期时间转换和对齐。
示例
在下面的示例中,我们将结合使用 NumPy 与"pytz"库来处理时区转换。首先,我们将使用 NumPy 创建一个日期时间数组,然后将该日期时间调整为不同的时区 -
import numpy as np import pytz from datetime import datetime # 定义一个日期时间数组 dates = np.array(['2024-01-01T12:00', '2024-01-02T12:00'], dtype='datetime64[m]') # 转换为 Python 日期时间对象 # 使用 astype('O') 将 datetime64 转换为日期时间对象 dt_objects = [d.item() for d in dates] # 使用 pytz 定义时区 timezone = pytz.timezone('US/Eastern') # 将每个日期时间转换为新的时区 localized_dates = [timezone.localize(dt) for dt in dt_objects] # 打印本地化时间 for date in localized_dates: print(date.strftime('%Y-%m-%d %H:%M:%S %Z%z'))
输出将显示转换为东部时区 (ET) 的日期时间值 -
2024-01-01 12:00:00 EST-0500 2024-01-02 12:00:00 EST-0500
时区转换
处理日期时间数据时,通常需要进行时区转换。这可以使用"pytz"等外部库来完成。创建可感知时区的 datetime 对象后,您可以使用 astimezone() 方法轻松地将其转换为其他时区。
示例
在下面的示例中,我们首先将 datetime 对象转换为东部标准时间 (EST),然后将其转换为太平洋标准时间 (PST) −
import pytz from datetime import datetime # 创建 datetime 对象 dt = datetime(2024, 1, 1, 12, 0, 0) # 定义时区(东部时区) eastern = pytz.timezone('US/Eastern') # 将 datetime 本地化为东部时间 localized_dt = eastern.localize(dt) # 转换为太平洋时区 pacific = pytz.timezone('US/Pacific') pacific_dt = localized_dt.astimezone(pacific) print("东部时间: ", localized_dt.strftime('%Y-%m-%d %H:%M:%S %Z%z')) print("太平洋时间: ", pacific_dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))
执行上述代码后,您将获得以下输出 -
东部时间:2024-01-01 12:00:00 EST-0500 太平洋时间:2024-01-01 09:00:00 PST-0800
对齐数据中的时区
在数据中使用多个时区时,跨时区对齐日期时间数据非常重要。您可能需要将所有日期时间转换为通用时区(例如 UTC),以确保准确的比较和计算。
您可以通过将每个日期时间对象转换为该时区,将时区感知的日期时间对齐到该时区。这可以使用相同的"pytz"库或"datetime"模块进行调整。
示例
在此示例中,我们将两个来自不同时区的日期时间对象与 UTC 时间对齐 -
import pytz from datetime import datetime # 创建两个不同时区的日期时间对象 dt1 = datetime(2024, 1, 1, 12, 0, 0, tzinfo=pytz.timezone('US/Eastern')) dt2 = datetime(2024, 1, 1, 12, 0, 0, tzinfo=pytz.timezone('US/Pacific')) # 将两个日期时间转换为 UTC dt1_utc = dt1.astimezone(pytz.utc) dt2_utc = dt2.astimezone(pytz.utc) # 以 UTC 格式打印两个日期时间对象 print("东部时间转换为 UTC:", dt1_utc.strftime('%Y-%m-%d %H:%M:%S %Z%z')) print("太平洋时间转换为 UTC:", dt2_utc.strftime('%Y-%m-%d %H:%M:%S %Z%z'))
输出将显示两个与 UTC 对齐的日期时间 -
东部时间转换为 UTC:2024-01-01 16:56:00 UTC+0000 太平洋时间转换为 UTC:2024-01-01 19:53:00 UTC+0000