gpt4 book ai didi

python - 如何使用 Dataframe 将 EST 转换为本地时间

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:46 26 4
gpt4 key购买 nike

我正在尝试将 EST 中的时间戳转换为 pandas 数据帧中的各种本地化时间戳。我有一个数据帧,其中包含 EST 时间戳和需要将其转换为的时区。

我知道已经有几个主题涉及此类主题。但是,它们要么以 UTC 开始,要么我无法使用我的数据进行复制。

写之前我查阅了:How to convert GMT time to EST time using python

我导入了数据:

import pandas
import datetime as dt
import pytz

transaction_timestamp_est local_timezone

2013-05-28 05:18:00+00:00 America/Chicago
2013-06-12 05:23:20+00:00 America/Los_Angeles
2014-06-21 05:26:26+00:00 America/New_York

我转换为日期时间并创建了以下函数:

df.transaction_timestamp_est = 
pd.to_datetime(df.transaction_timestamp_est)


def db_time_to_local(row):

db_tz = pytz.timezone('America/New_York')
local_tz = pytz.timezone(row['local_timezone'])

db_date = db_tz.localize(row['transaction_timestamp_est'])
local_date = db_date.astimezone(local_tz)

return local_date

我在这里运行它:

df['local_timestamp'] = df.apply(db_time_to_local, axis=1)

并收到此错误:

ValueError: ('Not naive datetime (tzinfo is already set)', 'occurred at index 0')

我期望数据框中有一个名为“local_timestamp”的新列,该列的时间戳根据 local_timezone 列中的数据进行调整。

感谢任何帮助!

最佳答案

您看到的错误看起来像是因为您正在尝试本地化 tz 感知时间戳。时间戳中的 '+00:00' 表示这些时间戳是 tz 感知的,采用 UTC(或类似的格式)。

一些术语:简单的日期/时间没有时区的概念,tz 感知(或本地化)的日期/时间与特定时区相关联。本地化是指将 tz-naive 日期/时间转换为 tz-aware 日期/时间。根据定义,您无法本地化 tz 感知的日期/时间:您要么将其转换为原始时区,然后本地化,要么直接转换为目标时区。

要将该列转换为 EST,请转换为 naive,然后本地化为 EST:

In [98]: df['transaction_timestamp_est'] = df['transaction_timestamp_est'].dt.tz_localize(None).dt.tz_localize('EST') 
In [99]: df
Out [99]:

0 2013-05-28 05:18:00-05:00
1 2013-06-12 05:23:20-05:00
2 2014-06-21 05:26:26-05:00
Name: transaction_timestamp_est, dtype: datetime64[ns, EST]

注意数据类型中的“EST”。然后,您可以将每个时间戳转换为其目标时区:

In [100]: df['local_ts'] = df.apply(lambda x: x[0].tz_convert(x[1]), axis=1)                                        

In [101]: df
Out[101]:
transaction_timestamp_est local_timezone local_ts
0 2013-05-28 05:18:00-05:00 America/Chicago 2013-05-28 05:18:00-05:00
1 2013-06-12 05:23:20-05:00 America/Los_Angeles 2013-06-12 03:23:20-07:00
2 2014-06-21 05:26:26-05:00 America/New_York 2014-06-21 06:26:26-04:00

解释一下:第一列中的每个元素的类型都是 pd.Timestamp 。它的 tz_convert() 方法更改其时区,将日期/时间转换为新时区。

这会产生一列混合时区的 pd.Timestamps ,这在 pandas 中处理起来很痛苦。大多数(也许是全部)对日期/时间列进行操作的 pandas 函数要求整个列具有相同的时区。

如果您愿意,可以转换为 tz-naive:

In [102]: df['local_ts'] = df.apply(lambda x: x[0].tz_convert(x[1]).tz_convert(None), axis=1)                                                      

In [103]: df
Out[103]:
transaction_timestamp_est local_timezone local_ts
0 2013-05-28 05:18:00-05:00 America/Chicago 2013-05-28 10:18:00
1 2013-06-12 05:23:20-05:00 America/Los_Angeles 2013-06-12 10:23:20
2 2014-06-21 05:26:26-05:00 America/New_York 2014-06-21 10:26:26

如果您的数据允许,最好尝试将时间戳(或索引)列保留在单个时区中。 UTC 通常是最好的,因为它没有 DST 转换或其他可能导致时间丢失/模糊的问题,而大多数其他时区都有这种情况。

关于python - 如何使用 Dataframe 将 EST 转换为本地时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56350416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com