【问题标题】:Python type error when adding TimedeltaIndex to date将 TimedeltaIndex 添加到日期时出现 Python 类型错误
【发布时间】: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.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: 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


【解决方案1】:

你可以简化为

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-08
    • 2016-11-06
    • 2018-07-09
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    相关资源
    最近更新 更多