将TimedeltaIndex添加到日期时出现Python类型错误



我正在使用Python 3.7.12,并试图了解将pandas.TimedeltaIndex对象添加到datetime.date对象的行为,特别是为什么有时会出现TypeError: unsupported operand type(s) for +: 'TimedeltaArray' and 'datetime.date'错误。我从源中提取数据,并将其加载到具有一行或多行的数据帧中,并尝试向包含该行的datetime.datepandas.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:不支持+的操作数类型:';datetime.time';和';Timedelta';

我试图将Pandasdelta对象添加到Pythondatetime中,但这两个堆栈不兼容。当两个操作数都有Pandas对象时,对于单行和多行数据帧,数据帧都会按预期进行更新。

df['adjusted_dates'] = df['dates'] + pd.TimedeltaIndex(df['deltas'].astype('int64'), unit='D')

现在我明白了为什么我的代码不总是成功,我很困惑为什么它不总是失败?

您可以简化为

import pandas as pd
df = pd.DataFrame({'dates': ['2017-04-27 15:59:59', '2017-04-28 15:59:59'],
'deltas': ['90', '180']})
# no need to provide a format, no need to use an index:
df['adjusted_dates'] = (pd.to_datetime(df['dates']) + 
pd.to_timedelta(df['deltas'].astype(int), unit='D'))
# df['adjusted_dates']
# 0   2017-07-26 15:59:59
# 1   2017-10-25 15:59:59
# Name: adjusted_dates, dtype: datetime64[ns]

或者,如果您只想将时间增量添加到日期,则忽略时间:

df['adjusted_dates'] = (pd.to_datetime(df['dates']).dt.floor('D') + 
pd.to_timedelta(df['deltas'].astype(int), unit='D'))
# df['adjusted_dates']
# 0   2017-07-26
# 1   2017-10-25
# Name: adjusted_dates, dtype: datetime64[ns]

请注意,在这两种情况下,您都将使用datetime64[ns]数据类型。如果您按天发言,时间只是不显示(默认为零/00:00:00(。

最新更新