Python 如何在具有时区感知时间戳列的数据帧上追加?

Python 如何在具有时区感知时间戳列的数据帧上追加?,python,pandas,pytz,Python,Pandas,Pytz,我有一个带有时间戳列和数字列的数据帧。如果timestamp列是timezone NAVE,我可以向它追加一个新行 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

我有一个带有时间戳列和数字列的数据帧。如果timestamp列是timezone NAVE,我可以向它追加一个新行

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
但如果我为timestamp列设置时区,然后尝试追加新行,则会出现错误

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'
df['timestamp']=df['timestamp'].apply(lambda x:x.tz_localize('utc'))
df
#时间戳编号
# 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])
#回溯(最近一次呼叫最后一次):
#文件“”,第1行,在
#文件“/Library/Python/2.7/site packages/pandas-0.17.1-py2.7-macosx-10.10-intel.egg/pandas/core/frame.py”,第4231行,在附录中
#验证\u完整性=验证\u完整性)
#concat中的文件“/Library/Python/2.7/site packages/pandas-0.17.1-py2.7-macosx-10.10-intel.egg/pandas/tools/merge.py”,第813行
#返回操作获取结果()
#文件“/Library/Python/2.7/site packages/pands-0.17.1-py2.7-macosx-10.10-intel.egg/pands/tools/merge.py”,第995行,在get_result中
#mgrs\u索引器,self.new\u轴,concat\u轴=self.axis,copy=self.copy)
#文件“/Library/Python/2.7/site packages/pandas-0.17.1-py2.7-macosx-10.10-intel.egg/pandas/core/internals.py”,第4456行,串联块管理器
#对于安置,请在concat_平面图中加入_单元]
#文件“/Library/Python/2.7/site packages/pandas-0.17.1-py2.7-macosx-10.10-intel.egg/pandas/core/internals.py”,第4561行,以串联连接单元表示
#concat_值=com.\u concat_compat(至concat,轴=concat_轴)
#文件“/Library/Python/2.7/site packages/pandas-0.17.1-py2.7-macosx-10.10-intel.egg/pandas/core/common.py”,第2548行,在
#返回_concat_compat(到_concat,轴=轴)
#文件“/Library/Python/2.7/site packages/pandas-0.17.1-py2.7-macosx-10.10-intel.egg/pandas/tseries/common.py”,第256行,in_concat_compat
#return DatetimeIndex(np.concatenate([x.tz\u localize(None).asi8表示x-in-to\u-concat]),tz=list(tzs)[0])
#AttributeError:'numpy.ndarray'对象没有属性'tz_localize'

对于如何将新行添加到具有时区感知timespamp列的数据帧,我们将不胜感激。

这是pandas版本中的一个错误(归功于)。 如他们所述,您的解决方案可以是:

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

您的熊猫版本是什么。我可以在0.16.1中很好地运行这个示例。另一方面,与其执行apply(pd.to_datetime),不如执行pd.to_datetime(df)。这一行:df[0]=df[0]。apply(pd.to_datetime)似乎也错了。似乎您想要df['timestamp']=df['timestamp']@克里斯,这是我的。这可能是我对熊猫野生密码最大的抱怨。我见过这样的情况:
df.apply(lambda x:x.sum())
和更糟的情况:/@克里斯,谢谢你指出问题中的错误。我使用的是熊猫版本0.17.1。