使用Pandas设置Python日期时间的字符串格式(有点)不稳定的时区

使用Pandas设置Python日期时间的字符串格式(有点)不稳定的时区,python,pandas,datetime,Python,Pandas,Datetime,使用Pandas解析数据的时间戳时遇到问题 我试图解析的日期时间格式的一个示例类似于2012-05-02 01:00:00-05:00。从Pandas文档,我被驱动到相关文档,这些文档建议我应该使用类似于%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_eng

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

我试图解析的日期时间格式的一个示例类似于2012-05-02 01:00:00-05:00。从Pandas文档,我被驱动到相关文档,这些文档建议我应该使用类似于%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)
此解决方案返回了一个数据帧,但无法解析请求的列。我想这是因为我的数据的时区组件有一个意外的冒号!例如,我给定的时区为-05:00,%z格式字符串预期为-0500


您有什么想法吗?

您可以编写一个函数来转换日期字符串格式。然后可以将其应用于列以转换为datetimes。此函数可以返回时区

代码:

测试结果:

使用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
您还可以在应用中使用dateutil.parser作为:


我不是这个风格的超级粉丝,因为它采用了固定偏移时区,这意味着它不知道夏令时。我个人更喜欢夏时制或UTC。

您可以编写一个函数来转换日期字符串格式。然后可以将其应用于列以转换为datetimes。此函数可以返回时区

代码:

测试结果:

使用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
您还可以在应用中使用dateutil.parser作为:

我不是这个风格的超级粉丝,因为它采用了固定偏移时区,这意味着它不知道夏令时。我个人更喜欢夏时制或UTC

                   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
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
import dateutil
df.timestamp.apply(dateutil.parser.parse)