【问题标题】:How to append on a dataframe with timezone aware timestamp column?如何在具有时区感知时间戳列的数据帧上附加?
【发布时间】:2016-03-29 17:39:17
【问题描述】:

我有一个包含时间戳列和数字列的数据框。如果时间戳列是天真时区,我可以向其附加一个新行。

df = pd.DataFrame([[1,2],[3,4]], columns=['timestamp', 'number'])
df['timestamp']=pd.to_datetime(df['timestamp'])
df
#                       timestamp  number
# 0 1970-01-01 00:00:00.000000001       2
# 1 1970-01-01 00:00:00.000000003       4

df.append(df.loc[0])
#                       timestamp  number
# 0 1970-01-01 00:00:00.000000001       2
# 1 1970-01-01 00:00:00.000000003       4
# 0 1970-01-01 00:00:00.000000001       2

但如果我为时间戳列设置时区,然后尝试追加新行,则会出错。

df['timestamp']=df['timestamp'].apply(lambda x: x.tz_localize('utc'))
df
#                             timestamp  number
# 0 1970-01-01 00:00:00.000000001+00:00       2
# 1 1970-01-01 00:00:00.000000003+00:00       4
df.append(df.loc[0])
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "/Library/Python/2.7/site-packages/pandas-0.17.1-py2.7-macosx-10.10-intel.egg/pandas/core/frame.py", line 4231, in append
#     verify_integrity=verify_integrity)
#   File "/Library/Python/2.7/site-packages/pandas-0.17.1-py2.7-macosx-10.10-intel.egg/pandas/tools/merge.py", line 813, in concat
#     return op.get_result()
#   File "/Library/Python/2.7/site-packages/pandas-0.17.1-py2.7-macosx-10.10-intel.egg/pandas/tools/merge.py", line 995, in get_result
#     mgrs_indexers, self.new_axes, concat_axis=self.axis, copy=self.copy)
#   File "/Library/Python/2.7/site-packages/pandas-0.17.1-py2.7-macosx-10.10-intel.egg/pandas/core/internals.py", line 4456, in concatenate_block_managers
#     for placement, join_units in concat_plan]
#   File "/Library/Python/2.7/site-packages/pandas-0.17.1-py2.7-macosx-10.10-intel.egg/pandas/core/internals.py", line 4561, in concatenate_join_units
#     concat_values = com._concat_compat(to_concat, axis=concat_axis)
#   File "/Library/Python/2.7/site-packages/pandas-0.17.1-py2.7-macosx-10.10-intel.egg/pandas/core/common.py", line 2548, in _concat_compat
#     return _concat_compat(to_concat, axis=axis)
#   File "/Library/Python/2.7/site-packages/pandas-0.17.1-py2.7-macosx-10.10-intel.egg/pandas/tseries/common.py", line 256, in _concat_compat
#     return DatetimeIndex(np.concatenate([ x.tz_localize(None).asi8 for x in to_concat ]), tz=list(tzs)[0])
# AttributeError: 'numpy.ndarray' object has no attribute 'tz_localize'

任何关于如何将新行附加到具有时区感知时间戳列的数据帧的帮助将不胜感激。

【问题讨论】:

  • 你的熊猫版本是什么。我可以在 0.16.1 中很好地运行这个示例。顺便说一句,不要执行 apply(pd.to_datetime),只需执行 pd.to_datetime(df)。这一行:df[0]=df[0].apply(pd.to_datetime) 似乎也是错误的,你似乎想要 df['timestamp'] = df['timestamp']。 .
  • @Chris 这个。这可能是我对 pandas-wild 代码的最大抱​​怨。我见过这样的事情:df.apply(lambda x: x.sum()) 甚至更糟。 ://
  • @Chris,感谢您指出问题中的错误。我正在使用熊猫版本 0.17.1。

标签: python pandas pytz


【解决方案1】:

这是熊猫版本中的一个错误(感谢this answer)。 正如他们在那里所说,您的解决方案可以是:

df = df.astype(str).append(df.loc[0].astype(str))
df['timestamp'] = pd.to_datetime(df['timestamp'], utc=True)

【讨论】:

    猜你喜欢
    • 2019-01-02
    • 2020-08-23
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2019-12-06
    • 1970-01-01
    • 2021-03-13
    相关资源
    最近更新 更多