【问题标题】:unsupported operand type(s) for -: 'datetime.time' and 'datetime.time'- 不支持的操作数类型:“datetime.time”和“datetime.time”
【发布时间】:2018-03-24 15:22:41
【问题描述】:
Ca  Tên NVNL    Check in    Check out   Thời gian làm việc trong ca     Hỗ trợ ăn trưa
0   Ca Sáng     Ngô Hải Anh     08:15:00    12:13:00    NaN     NaN
1   Ca Chiều    Ngô Hải Anh     14:00:00    17:35:00    NaN     NaN
2   Ca Chiều    Ngô Văn Ninh    13:30:00    17:57:00    NaN     NaN
3   Ca Chiều    Nguyễn Hoàng Anh    14:00:00    17:43:00    NaN     NaN

我想减去 Check out to Check In 列。通过这段代码

data['Thời gian làm việc']= data['Check out '] - data['Check in']

但我收到此错误:TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time' 请帮帮我。

【问题讨论】:

  • pd.to_datetime(data['Check out ']) -pd.to_datetime( data['Check in'])
  • 也可以看看datetime.timedelta

标签: python pandas xlsx


【解决方案1】:

我认为这里可以通过to_timedelta 将值转换为时间增量,但首先转换为strings:

data['Thời gian làm việc']= (pd.to_timedelta(data['Check out'].astype(str)) - 
                             pd.to_timedelta(data['Check in'].astype(str)))

to_datetimedatetimes

data['Thời gian làm việc']= (pd.to_datetime(data['Check out'].astype(str)) - 
                             pd.to_datetime(data['Check in'].astype(str)))

【讨论】:

  • 我遇到了同样的错误,您的解决方案有效。谢谢。快速问题:我怎么知道在转换为 timedelta 或 datetime 之前我需要先将其转换为字符串?
  • @IrfanHarun - 检查第一个值的类型 - 如果是字符串,则不需要,否则转换。
  • @IrfanHarun - print (type(df.loc[0, 'data['Check out']']))
【解决方案2】:

我建议您退后一步,考虑一下您的数据模型。 time 不是时间点,引用自 Python 的文档:

时间对象表示一天中的(本地)时间,独立于任何特定日期

.. 所以减去时间没有多大意义。假设我晚上 9 点入住,两天后晚上 8 点退房。您认为“晚上 8 点减 9 点”代表什么?

您的签入/签出列可能会更好地建模为datetime,其中 do 代表时间点。减去日期时间确实有效,并且它具有实际含义:将两个时间点分开的时间。

【讨论】:

  • 不,签入和签出将是datetime。两者之间的差异timedelta
  • 是的,同意。但是如果出于某种原因想要使用时间,那么最好是 timedelatas,它在 pandas 中的支持非常好,也可以减去。
猜你喜欢
  • 2015-09-18
  • 2021-05-22
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多