【问题标题】:Dealing with timezone naive datetimes in Pandas在 Pandas 中处理时区天真的日期时间
【发布时间】:2014-12-13 04:56:54
【问题描述】:

我有一些包含时区原始日期的 JSON 数据。

["2014-03-07T09:04:26.943", "2014-03-06T20:35:21.937", "2014-02-25T12:39:44"]

我使用 pandas.read_json 读取此数据,并将其视为对象列。

我知道数据是太平洋时区,而不是 UTC。

是否有一种矢量化的方式将其转换为 np.datetime64 列?目前,我正在做:

def _parse_datetime(dt_string):
    # We are provided timezone naive data that is in Pacific time. Convert it to UTC.
    timestamp = pd.Timestamp(dt_string, tz="US/Pacific")
    if pd.isnull(timestamp):
        return pd.NaT
    return np.datetime64(timestamp)

data.apply(_parse_datetime)

对于大量数据来说真的很慢

更新:

通过指定 convert_dates,我可以将数据强制转换为日期时间。但是,在尝试本地化时,出现错误:

>>> dates = """["2014-03-07T09:04:26.943", "2014-03-06T20:35:21.937", "2014-02-25T12:39:44"]""" 
>>> baz = pd.read_json(dates, convert_dates=[0])[0]
>>> baz.tz_localize('US/Pacific')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/abeer/.virtualenvs/venv/lib/python2.7/site-packages/pandas/core/generic.py", line 3494, in tz_localize
ax_name)
TypeError: index is not a valid DatetimeIndex or PeriodIndex

更一般地说,我正在尝试对数据框中的列执行此操作,因此我无法修改索引。

【问题讨论】:

  • convert_dates kwarg 设置为具有日期值的列是否有助于最初将值读取为日期?

标签: python datetime pandas


【解决方案1】:

使用 convert_dates 选项指定列,或者使用系列类型选项应该自动转换。

>>> pd.read_json(dates, convert_dates=[0])[0]
0   2014-03-07 09:04:26.943000
1   2014-03-06 20:35:21.937000
2          2014-02-25 12:39:44
Name: 0, dtype: datetime64[ns]
>>> pd.read_json(dates, typ='series')
0   2014-03-07 09:04:26.943000
1   2014-03-06 20:35:21.937000
2          2014-02-25 12:39:44
dtype: datetime64[ns]

从那里您可以在时间戳上使用 tz_localize。假设这太慢了......

baz.apply(lambda ts: ts.tz_localize('US/Pacific'))

内联的 tz_localize 作用于索引(而不是值):

>>> pd.Series(index=baz).tz_localize('US/Pacific')
0
2014-03-07 09:04:26.943000-08:00   NaN
2014-03-06 20:35:21.937000-08:00   NaN
2014-02-25 12:39:44-08:00          NaN
dtype: float64

【讨论】:

  • 谢谢,传递 convert_dates 有助于正确解析日期。但是,我仍然不能以未矢量化的方式使用 tz_localize。我用更多细节更新了问题。
猜你喜欢
  • 2021-05-30
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 2019-07-23
  • 2013-03-11
  • 2020-01-05
  • 1970-01-01
相关资源
最近更新 更多