gpt4 book ai didi

python - 使用 Pandas 的具有(稍微)不稳定时区的 Python 日期时间的字符串格式

转载 作者:太空宇宙 更新时间:2023-11-04 10:02:03 28 4
gpt4 key购买 nike

我在使用 Pandas 解析数据的时间戳时遇到问题。

我尝试解析的日期时间格式示例类似于 2012-05-02 01:00:00-05:00。从 Pandas 文档中,我被驱动到相关的 Python datetime formatting建议我应该使用类似于 %Y-%m-%d %H:%M:%S%z 的格式化字符串的文档。

我使用格式化字符串如下...

fmts = {"variable_name": `%Y-%m-%d %H:%M:%S%z`}
df = pd.read_sql_query("SELECT * FROM some_table", con=some_engine, parse_dates=fmts)

此解决方案返回了 Dataframe 但无法解析请求的列。我认为这是因为我数据的时区部分有一个意外的冒号!例如,我给出的时区是 -05:00 并且 %z 格式字符串需要 -0500

关于如何处理这个问题有什么想法吗?

最佳答案

您可以设计一个函数来转换您的日期字符串格式。然后它可以应用于列以转换为日期时间。这个函数可以返回时区 aware or naive timestamps .

代码:

import datetime as dt
import pytz

def convert_to_datetime(tz=None):
""" Convert our custom timezone representation to a datetime

Timestamp looks like: 2012-05-02 01:00:00-05:00

:param tz: None, returns UTC relative Naive
True, returns timezone aware timestamp in UTC
<tz>, returns timezone aware timestamp in given timezone
:return: returns a processing function that can be passed to apply()
"""

def func(datetime_string):
time = datetime_string[:19]
tz_str = datetime_string[19:]

# parse the timezone offset to minutes and seconds
tz_offset = int(
tz_str[0] + str(int(tz_str[1:3]) * 60 + int(tz_str[4:])))

# return a datetime that is offset
result = dt.datetime.strptime(time, '%Y-%m-%d %H:%M:%S') - \
dt.timedelta(minutes=tz_offset)

if tz is not None:
result = result.replace(tzinfo=pytz.UTC)

if tz is not True:
result = result.astimezone(tz)
return result

return func

测试代码:

df = pd.DataFrame([
'2012-05-02 01:00:00-05:00',
'2012-05-02 03:00:00-05:00'],
columns=['timestamp'])

df['zulu_no_tz'] = df.timestamp.apply(convert_to_datetime())
df['utc_tz'] = df.timestamp.apply(convert_to_datetime(tz=True))
df['local_tz'] = df.timestamp.apply(convert_to_datetime(
tz=pytz.timezone('US/Central')))
print(df)

测试结果:

                   timestamp          zulu_no_tz                    utc_tz  \
0 2012-05-02 01:00:00-05:00 2012-05-02 06:00:00 2012-05-02 06:00:00+00:00
1 2012-05-02 03:00:00-05:00 2012-05-02 08:00:00 2012-05-02 08:00:00+00:00

local_tz
0 2012-05-02 01:00:00-05:00
1 2012-05-02 03:00:00-05:00

使用dateutil:

如果您有权访问 dateutil你可以使用他们的解析代码。这是上面 func 的替代品,它可以很好地处理您的日期格式。

import dateutil

def func(datetime_string):
result = dateutil.parser.parse(datetime_string).astimezone(pytz.UTC)

if tz is None:
result = result.replace(tzinfo=None)
elif tz is not True:
result = result.astimezone(tz)
return result

您还可以在 apply() 中使用裸露的 dateutil.parser 作为:

import dateutil
df.timestamp.apply(dateutil.parser.parse)

我不是这种风格的 super 粉丝,因为它应用了固定偏移时区,这意味着它不了解夏令时。我个人更喜欢夏令时意识或简单的 UTC。

关于python - 使用 Pandas 的具有(稍微)不稳定时区的 Python 日期时间的字符串格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43027876/

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