使用12小时轮班制中的pandas datetime对数据进行分组:上午7点下午7点和第二天上午7点下午7点

2024-09-29 00:11:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,它有两列。它有一个名为“DateAndTime”的列(datetime64[ns]) 以及一个名为“Finished”(Bool)的专栏。大约有5000多行,都有不同的日期和时间,并且“Finished”列为True

我想做的是将数据分组为早上7点到晚上7点和晚上7点到早上7点的“班次”,并计算12小时内发生的真实次数

df.head()

DateAndTime                   Finished
109 2020-07-28 14:36:07.983     True
110 2020-07-28 14:36:34.547     True
111 2020-07-28 14:39:38.187     True
112 2020-07-28 14:41:10.547     True
113 2020-07-28 14:41:32.250     True

df.describe()

       DateAndTime                    Finished
count   5915                            5915
unique  5915                            2
top     2020-07-29 07:34:25.360000      True
freq    1                               5914
first   2020-07-28 14:36:07.983000      NaN
last    2020-08-05 04:57:10.657000      NaN


Tags: 数据truedf时间nan次数headbool
2条回答

你应该试试这个

import numpy as np

#in case columns are in String Format 
df = df.astype({'DateAndTime': np.datetime64, 'Finished':np.bool}) 

# 7AM : 7PM Shift
shift_1 = df[df.DateAndTime.apply(lambda t: (t.hour in range(7, 19)) or (t.hour==19 and (t.second+t.minute==0)))]

# 7PM : 7AM Shift
shift_2 = df[df.DateAndTime.apply(lambda t: not ((t.hour in range(7, 19)) or (t.hour==19 and (t.second+t.minute==0))))]

shift_1_TruedCount = shift_1.Finished.to_list().count(True)
shift_2_TruedCount = shift_2.Finished.to_list().count(True)

print(shift_1_TruedCount, shift_2_TruedCount)

假设您的DateAndTime列已经是Timestamp类型:

# Move DateAndTime back by 7 hours
# Now shift 1 is 0:00 to 12:00, shift 2 is 12:00 - 24:00
h = (df['DateAndTime'] - pd.Timedelta(hours=7)).dt.hour < 12
df['Shift'] = h.map({True: '7am-7pm', False: '7pm-7am'})

相关问题 更多 >