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

2024-01-06

我正在使用 Python 3.7.12 并试图理解添加pandas.TimedeltaIndex反对datetime.date对象,特别是为什么我有时会得到一个TypeError: unsupported operand type(s) for +: 'TimedeltaArray' and 'datetime.date'错误。我正在从源中提取数据并将其加载到包含一行或多行的数据框中,并尝试向包含行之和的所有行添加新列datetime.date and 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:类型错误:+ 不支持的操作数类型:“datetime.time”和“Timedelta” https://stackoverflow.com/questions/43506680/python-pandas-typeerror-unsupported-operand-types-for-datetime-time-and

我试图添加熊猫deltaPython 对象datetime,但这两个堆栈不兼容。当我的两个操作数都有 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]

或者,如果您只想将 timedelta 添加到date,忽略时间:

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)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 TimedeltaIndex 添加到日期时出现 Python 类型错误 的相关文章

随机推荐