由于数据类型错误,无法从时间数据中减去小时数

Posted

技术标签:

【中文标题】由于数据类型错误,无法从时间数据中减去小时数【英文标题】:Can't subtract hours from time data because of data type error 【发布时间】:2021-02-21 06:13:56 【问题描述】:

我正在尝试根据某些条件从我的时间数据中减去 12 小时,但它不起作用。 我的数据如下所示:

 StartTime        EndTime       Hours
12:00:00         00:30:00        5.5       
12:00:00         00:30:00       -4.5
13:00:00         01:20:00       -6.5
12:30:00         04:06:00       -12.1
12:30:00         04:06:00       -12.1
12:30:00         04:06:00       -12.1

如果“小时”为负数而不是 -12.1,我想在 EndTime 中将 AM 翻转为 PM(例如 - 或 + 12 小时)。所以我这样做了:

if df[df["Hour"] < 0].all().all()  and df["Hours"].all().all() != -12.1:
    df["EndTime"] = pd.to_datetime(df["EndTime"]) - timedelta(hours=12) 

但我的数据没有变化。 EndTime 和 StartTime 的当前数据类型是对象,因此我尝试将其从对象更改为日期时间,但出现此错误。 TypeError: 不能转换为日期时间

我厌倦了这些代码(不是同时),但它们都不起作用。

df['Hours'] = df['Hours'].astype('datetime64')
df['Hours'] = pd.to_datetime(df['Hours']).dt.time
df['Hours'] = pd.to_datetime(df['Hours']).dt.floor('d')

我不确定我的代码是否因为我的时间值的数据类型而减去了 12 小时,或者我为我的 if 语句选择了错误的选项。例如,我不确定在这种情况下是否可以使用 all().all()。

【问题讨论】:

if 语句中,有Hour 而不是Hours。会不会是这个问题? 不,情况并非如此。还是不行 我发布了一个关于可能的解决方法的答案,将timedelta 添加到time。我不知道如何在pandas 中应用这些,但无论如何它可能会有所帮助。 【参考方案1】:

time 类的对象不支持加法/减法运算,因此您必须以某种方式使用datetime 对象:

>>> from datetime import datetime, date, time, timedelta

>>> end_time = time(1, 20, 0)

>>> end_datetime = datetime.combine(date(2020, 1, 1), end_time)
>>> new_datetime = end_datetime + timedelta(hours=12)

>>> new_end_time = new_datetime.time()
>>> new_end_time
datetime.time(13, 20)

或者只是简单地替换 time 对象中的小时:

>>> end_time = time(1, 20, 0)

>>> new_hour = (end_time.hour + 12) % 24
>>> new_end_time = end_time.replace(hour=new_hour)

>>> new_end_time
datetime.time(13, 20)

【讨论】:

以上是关于由于数据类型错误,无法从时间数据中减去小时数的主要内容,如果未能解决你的问题,请参考以下文章

由于数据类型,无法查询从 Google 表格加载的 BigQuery 表

Python PySpark:从日期列中减去整数列错误:列对象不可调用

db2数据库 我要根据当前时间减去一个小时作为开始时间,当前时间作为结束时间查询总数量

Spark 案例类 - 十进制类型编码器错误“无法从十进制向上转换”

减去不同时区的日期时间

SQL减去两列给出错误-数据类型的运算符无效。运算符等于减法,类型等于nvarchar