我有一个 df 如下所示,它显示了一个人何时开始轮类、结束轮类、工作小时数和日期。
Business_Date Number PayTimeStart PayTimeEnd Hours
0 2019-05-24 1 2019-05-24 11:00:00 2019-05-24 12:15:00 1.250
1 2019-05-24 2 2019-05-24 12:30:00 2019-05-24 13:30:00 1.00
现在我要做的是将其分解为每小时格式,这样我就知道在 11:00 - 12:00 之间使用了多少小时
因此,在我的脑海中,对于上述内容,我想将 11 点到 12 点之间的 1 小时放入 11:00 的容器中,其余 0.25 小时放入下一个 12 点的容器中
所以我最终会得到类似的东西
Business Date Time Hour
0 2019-05-24 11:00 1
1 2019-05-24 12:00 0.75
2 2019-05-24 13:00 0.5
最佳答案
一个想法是使用分钟 - 首先使用列表理解和扁平化 Series
,然后按 hours
分组,用 hour
进行计数GroupBy.size
最后除以 60
得到最后几个小时:
s = pd.Series([z for x, y in zip(df['Pay Time Start'],
df['Pay Time End'] - pd.Timedelta(60, unit='s'))
for z in pd.date_range(x, y, freq='Min')])
df = (s.groupby([s.dt.date.rename('Business Date'), s.dt.hour.rename('Time')])
.size()
.div(60)
.reset_index(name='Hour'))
print (df)
Business Date Time Hour
0 2019-05-24 11 1.00
1 2019-05-24 12 0.75
2 2019-05-24 13 0.50
如果您需要按位置或 ID 分组
df1 = pd.DataFrame([(z, w) for x, y, w in zip(df['Pay Time Start'],
df['Pay Time End'] - pd.Timedelta(60, unit='s'),
df['Location']) for z in pd.date_range(x, y, freq='Min')],
columns=['Date','Location'])
df = (df1.groupby([df1['Date'].dt.date.rename('Business Date'),
df1['Date'].dt.hour.rename('Time'), df1['Location']])
.size() .div(60) .reset_index(name='Hour'))
关于python - 将轮类数据(开始和结束时间)拆分为每小时数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56341590/