【发布时间】:2022-01-17 02:14:28
【问题描述】:
我正在使用 Python 3.7.12 并试图了解将 pandas.TimedeltaIndex 对象添加到 datetime.date 对象的行为,特别是为什么我有时会收到 TypeError: unsupported operand type(s) for +: 'TimedeltaArray' and 'datetime.date' 错误。我正在从源中提取数据并将其加载到具有一行或多行的数据框中,并尝试向包含该行的 datetime.date 和 pandas.TimedeltaIndex 总和的所有行添加一个新列。只要数据框中至少有两行,我的代码就可以工作,例如
import pandas as pd
import logging
logging.basicConfig(level=logging.DEBUG)
data = {'dates': [pd.to_datetime('2017-04-27 15:59:59', format='%Y-%m-%d %H:%M:%S'),
pd.to_datetime('2017-04-28 15:59:59', format='%Y-%m-%d %H:%M:%S')],
'deltas': ['90', '180']}
df = pd.DataFrame(data)
df['adjusted_dates'] = df['dates'].dt.date + pd.TimedeltaIndex(df['deltas'].astype('int64'), unit='D')
# The deltas have been applied and df is in the expected shape
logging.debug("Job done")
但是,如果我的数据框中只有一行,则会收到错误消息:
import pandas as pd
import logging
logging.basicConfig(level=logging.DEBUG)
data = {'dates': [pd.to_datetime('2017-04-27 15:59:59', format='%Y-%m-%d %H:%M:%S')],
'deltas': ['90']}
df = pd.DataFrame(data)
# TypeError: unsupported operand type(s) for +: 'TimedeltaArray' and 'datetime.date'
df['adjusted_dates'] = df['dates'].dt.date + pd.TimedeltaIndex(df['deltas'].astype('int64'), unit='D')
# We don't get this far
logging.debug("Job done")
为什么我在单行数据帧中看到此错误?任何帮助将不胜感激。
编辑:我在 Stack Overflow 上发现了另一个问题,它回答了为什么我的代码有时会失败:Python Pandas: TypeError: unsupported operand type(s) for +: 'datetime.time' and 'Timedelta'
我试图将 Pandas delta 对象添加到 Python datetime,但这两个堆栈不兼容。当我有两个操作数的 Pandas 对象时,数据帧会按预期更新单行和多行数据帧。
df['adjusted_dates'] = df['dates'] + pd.TimedeltaIndex(df['deltas'].astype('int64'), unit='D')
现在我明白了为什么我的代码并不总是成功,我很困惑为什么它并不总是失败?
【问题讨论】:
-
所以,我明白为什么我的代码并不总是成功,但我对为什么它并不总是失败感到困惑 - 具体还是什么意外失败?跨度>
-
这里的message我认为,如果你在pandas中进行时间序列分析,请使用pandas timeseries functionality。 不要混入 Python 日期时间、日期或时间类对象。这将失败或削弱您使用 pandas datetime 手头的功能(参见例如dt accessor)。
标签: python pandas dataframe datetime timedelta