Python 使用pandas datetime在12小时轮班制(上午7点到晚上7点)和第二天晚上7点到早上7点)对数据进行分组
我有一个数据帧,它有两列。它有一个名为“DateAndTime”的列(datetime64[ns]) 以及一个名为“Finished”(Bool)的专栏。大约有5000多行,都有不同的日期和时间,并且“Finished”列为True 我想做的是将数据分组为早上7点到晚上7点和晚上7点到早上7点的“班次”,并计算12小时内发生的真实次数Python 使用pandas datetime在12小时轮班制(上午7点到晚上7点)和第二天晚上7点到早上7点)对数据进行分组,python,pandas,datetime,Python,Pandas,Datetime,我有一个数据帧,它有两列。它有一个名为“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
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
你应该试试这个
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'})
#将日期和时间向后移动7小时
#现在1班是0:00到12:00,2班是12:00到24:00
h=(df['DateAndTime']-pd.Timedelta(小时=7)).dt.hour<12
df['Shift']=h.map({True:'7am-7pm',False:'7pm-7am'})
使用。研究如下内容:可以使用偏移量重新采样
。使用偏移量重新采样正是我想要的。谢谢。最后我使用了这个df.resample('12h',base=7.count()
,因为当我使用loffset
时,它没有正确分组