【问题标题】:TypeError: <class 'datetime.time'> is not convertible to datetimeTypeError: <class 'datetime.time'> 不能转换为日期时间
【发布时间】:2018-03-20 16:21:59
【问题描述】:

问题有点简单。我的目标是计算两个日期之间的天数差,比如 A 和 B。

这些是我的尝试:

df['daydiff'] = df['A']-df['B']

df['daydiff'] = ((df['A']) - (df['B'])).dt.days

df['daydiff'] = (pd.to_datetime(df['A'])-pd.to_datetime(df['B'])).dt.days

这些以前对我有用,但由于某种原因,这次我不断收到此错误:

TypeError: 类 'datetime.time' 不能转换为日期时间

当我将 df 导出到 excel 时,日期可以正常工作。有什么想法吗?

【问题讨论】:

  • 这个不行?(pd.to_datetime(df['A'])-pd.to_datetime(df['B'])).dt.days
  • @Wen 出于某种原因,我什至无法应用 pd.to_datetime。错误将是类“datetime.time”不可转换为日期时间
  • 那我们需要看看我朋友的样本数据
  • 可以打印数据的头部吗?
  • 啊。我现在看到了问题。 pd.to_datetime 不能应用于“B”日期

标签: pandas date datetime


【解决方案1】:

先尝试转换为str类型;然后使用pd.to_datetime:

df['time'] = pd.to_datetime(df['time'].astype(str))

例子:

from datetime import datetime
s = pd.Series([datetime.time(x) for x in pd.to_datetime(['16:17:33', '17:22:34'])])

这看起来像:

0    16:17:33
1    17:22:34
dtype: object

现在,让我们尝试转换为datetime

out = pd.to_datetime(s)

这会引发以下错误(OP 中的相同):

TypeError: 不能转换为日期时间

不过,改成类型先解决问题:

out = pd.to_datetime(s.astype(str))

输出:

0   2022-02-28 16:17:33
1   2022-02-28 17:22:34
dtype: datetime64[ns]

要获取时间组件,请使用dt.strftime

out = pd.to_datetime(s.astype(str)).dt.strftime('%H:%M:%S')

输出:

0    16:17:33
1    17:22:34
dtype: object

【讨论】:

    【解决方案2】:

    使用 pd.Timestamp 处理格式化时间中的尴尬差异。

    df['A'] = df['A'].apply(pd.Timestamp)  # will handle parsing
    df['B'] = df['B'].apply(pd.Timestamp)  # will handle parsing
    df['day_diff'] = (df['A'] - df['B']).dt.days
    

    当然,如果您不想更改正在输出的 DataFrame 中的 df['A'] 和 df['B'] 的格式,您可以在单行中执行此操作。

    df['day_diff'] = (df['A'].apply(pd.Timestamp) - df['B'].apply(pd.Timestamp)).dt.days
    

    这将为您提供整数之间的天数。

    【讨论】:

    • 谢谢!但是,我仍然得到 TypeError: Cannot convert input [00:00:00] of type to Timestamp :(
    • 你能在你的数据框上调用 .dtypes 吗?你有混合类型吗?
    • @TylerNG 嘿,我想知道你是如何做到这一点的?在尝试解决我自己的不同问题时,我遇到了类似的问题(TypeError: Cannot convert input [11:00:00] of type to Timestamp)。谢谢!
    • is not convertible to datetime 对我来说这是显示
    【解决方案3】:

    当我应用 emmet02 提供的解决方案时,我也得到 TypeError: Cannot convert input [00:00:00] of type 。这基本上是说数据帧包含缺失的时间戳值,表示为 [00:00:00],并且该值被pandas.Timestamp 函数拒绝。

    要解决这个问题,只需在使用前应用合适的缺失值策略来清理您的数据集

    df.apply(pd.Timestamp)
    

    【讨论】:

    • 没有办法让.apply(pd.Timestamp) 工作,至少在 Python 1.1.2 中是这样
    • @linello 我希望您指的是 Pandas 1.1.2,因为如果您使用的是 Python 1.1……欢迎来到未来!我们有 Python 3.9!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多