numpy 如何在Python中根据开始时间和停止时间创建持续时间列?

4xy9mtcn  于 2022-11-10  发布在  Python
关注(0)|答案(2)|浏览(139)

我正在尝试制作一个具有持续时间的列(小时-例如,第一个小时将是1.424小时)。我的数据是这样的。

CLOCK_START和CLOCK_STOP是对象。

我尝试了以下几种方法:

df['Duration'] = (df_nyc['Clock_Stop'] - df['Clock_Start']).astype('timedelta64[m]').astype(int)

..。但我得到以下错误:
TypeError:不支持-的操作数类型:“”Datetime.time“”和“”Datetime.time“”
有人能告诉我我做错了什么吗?如有任何帮助,我们将不胜感激:)

5w9g7ksd

5w9g7ksd1#

时间本身是不能加减的。您需要转换为Timedelta。有一个在开始时间之前的停止时间,我认为这是因为已经过了午夜。在这种情况下,将结果增加24小时:

h = (pd.to_timedelta(df["Clock_Stop"]) - pd.to_timedelta(df["Clock_Start"])) / pd.Timedelta(hours=1)
h = h.mask(h < 0, h + 24)
toiithl6

toiithl62#

你有一些类似的东西

from datetime import time
import pandas as pd

df = pd.DataFrame({"Clock_Start": [time(20,52), time(23,19,55), time(12,17,30)],
                   "Clock_Stop": [time(22,17,27), time(23,41,46), time(3,44)]})

df
  Clock_Start Clock_Stop
0    20:52:00   22:17:27
1    23:19:55   23:41:46
2    12:17:30   03:44:00

注意,这里有一个含糊不清的问题:第3行,第二天是03:44:00吗?或者两天后?还是在前一天?!这就是为什么你不能简单地加或减时间。一般来说,这是正确的,而不仅仅是当t0>t1时。
但您可以通过使用timedelta类型来消除歧义,并指定例如,如果差值为负数,则假定相隔一天,否则为同一天。例如:


# convert datetime.time -> pandas.Timedelta

df["Clock_Start"] = pd.to_timedelta(df["Clock_Start"].astype(str))
df["Clock_Stop"] = pd.to_timedelta(df["Clock_Stop"].astype(str))

df["Duration"] = df["Clock_Stop"] - df["Clock_Start"]

# df["Duration"]

# 0     0 days 01:25:27

# 1     0 days 00:21:51

# 2   -1 days +15:26:30

# Name: Duration, dtype: timedelta64[ns]

df.loc[df["Duration"]<pd.Timedelta(0)] += pd.Timedelta(days=1)

### alternatively ###

# df["Duration"] = np.where((df["Clock_Stop"]-df["Clock_Start"]) > pd.Timedelta(0),

# df["Clock_Stop"]-df["Clock_Start"],

# (df["Clock_Stop"]-df["Clock_Start"]) + pd.Timedelta(days=1))

# df["Duration"]

# 0   0 days 01:25:27

# 1   0 days 00:21:51

# 2   0 days 15:26:30

# Name: Duration, dtype: timedelta64[ns]

现在,您可以获得持续时间的其他表示形式,例如小数小时数

df["Duration"].dt.total_seconds()/3600
0     1.424167
1     0.364167
2    15.441667
Name: Duration, dtype: float64

相关问题