【问题标题】:How to read datetime with timezone in pandas如何在熊猫中读取带有时区的日期时间
【发布时间】:2013-09-25 12:22:17
【问题描述】:

我正在尝试从 csv 创建一个数据框,它的第一列就像

"2013-08-25T00:00:00-0400";
"2013-08-25T01:00:00-0400";
"2013-08-25T02:00:00-0400";
"2013-08-25T03:00:00-0400";
"2013-08-25T04:00:00-0400";

这是带有时区的日期时间!我已经用过类似的东西

df1 = DataFrame(pd.read_csv(PeriodC, sep=';', parse_dates=[0], index_col=0))

但结果是

2013-09-02 04:00:00                                                                                    
2013-09-03 04:00:00                                                                                     
2013-09-04 04:00:00                                                                                     
2013-09-05 04:00:00                                                                                      
2013-09-06 04:00:00                                                                                     
2013-09-07 04:00:00                                                                                     
2013-09-08 04:00:00

谁能解释我如何将日期时间与时区分开?

【问题讨论】:

  • 您想只处理日期时间组件还是要考虑时区?

标签: python datetime pandas


【解决方案1】:

如果您还想将所有日期转换为 utc(更好地存储),您可以这样做:

df = pd.read_csv(file, sep=';', parse_dates=[0], index_col=[0],
                 date_parser=lambda x: pd.to_datetime(x, utc=True),
                 index_col=[0])

所以你可以选择时间:

df.loc["2013-08-25"]

【讨论】:

    【解决方案2】:

    如果您在导入 csv 时不解析日期,而是在第二步中使用 pd.to_datetime 解析它们,您将获得预期的固定 UTC 偏移量。例如:

    s = pd.Series(["2013-08-25T00:00:00-0400",
                   "2013-08-25T01:00:00-0400",
                   "2013-08-25T02:00:00-0400",
                   "2013-08-25T03:00:00-0400",
                   "2013-08-25T04:00:00-0400"])
    
    pd.to_datetime(s)
    
    0   2013-08-25 00:00:00-04:00
    1   2013-08-25 01:00:00-04:00
    2   2013-08-25 02:00:00-04:00
    3   2013-08-25 03:00:00-04:00
    4   2013-08-25 04:00:00-04:00
    dtype: datetime64[ns, pytz.FixedOffset(-240)]
    

    也可以直接解析为UTC:

    pd.to_datetime(s, utc=True)
    
    0   2013-08-25 04:00:00+00:00
    1   2013-08-25 05:00:00+00:00
    2   2013-08-25 06:00:00+00:00
    3   2013-08-25 07:00:00+00:00
    4   2013-08-25 08:00:00+00:00
    dtype: datetime64[ns, UTC]
    

    (pd.__version__1.3.0)

    【讨论】:

      【解决方案3】:

      如果你使用pandas,可以试试

      df['time'] = pd.to_datetime(df['time'])
      

      【讨论】:

        【解决方案4】:

        Pandas 解析器会考虑时区信息(如果可用),并为您提供一个简单的时间戳(简单 == 没有时区信息),但会考虑时区偏移量。

        要将时区信息保留在 DataFrame 中,您应该首先将时间戳本地化为 UTC,然后将它们转换为它们的时区(在本例中为 Etc/GMT+4):

        >>> df = pd.read_csv(PeriodC, sep=';', parse_dates=[0], index_col=0)
        >>> df.index[0]
        >>> Timestamp('2013-08-25 04:00:00', tz=None)
        >>> df.index = df.index.tz_localize('UTC').tz_convert('Etc/GMT+4')
        >>> df.index[0]
        Timestamp('2013-08-25 00:00:00-0400', tz='Etc/GMT+4')
        

        如果您想完全放弃时区信息,那么只需指定一个date_parser,它将拆分字符串并仅将日期时间部分传递给解析器。

        >>> df = pd.read_csv(file, sep=';', parse_dates=[0], index_col=[0]
                             date_parser=lambda x: pd.to_datetime(x.rpartition('-')[0]))
        >>> df.index[0]
        Timestamp('2013-08-25 00:00:00', tz=None)
        

        【讨论】:

        • 为什么 -4 的时间是 GMT+4 ?我以为标志是一样的。
        • 没有其他选择吗?我的意思是,您必须提前知道日期字符串中的时区,这似乎有点违背了这一点。我的意思是我想我理解不能保证输入数组中的所有日期都具有相同的偏移量,但似乎它们通常会这样,并且 pandas 可以保留这些信息。我想先把它们去掉并手动检查它们是否相同是可能的,但这只是我犯错误的另一个地方,图书馆可以保护我免受伤害。
        猜你喜欢
        • 2020-08-12
        • 1970-01-01
        • 2020-10-19
        • 2022-07-06
        • 2022-01-07
        • 2020-05-15
        • 2023-04-04
        • 2021-05-08
        相关资源
        最近更新 更多