我有一个包含开始和结束时间的操作的数据集。我想标记每一天(早上,中午,晚上,晚上)的每一行。由于某些操作可能从一个部分开始而在另一个部分结束,因此我想考虑大部分时间花在哪里。
假设早上6点至11点,中午是上午11点至凌晨2点,我在上午10:30至下午1点之间采取行动,应将其标记为noon
。
我采用的一种方法是为每天的每个部分创建一个列,并计算每个部分(每行)花费的秒数,然后使用idxmax
查找一天中的部分。但是,我如何计算(start, stop)
到一天中的部分时间重叠?
答案 0 :(得分:2)
df = pd.DataFrame([[0, 4],
[2, 5.2],
[0.2, 6],
[3, 4.1]], columns=['start', 'end'])
periods = {'morning': (0, 3),
'afternoon': (3, 6)}
for name, (start, stop) in periods.items():
df['i_start'] = start
df['i_end'] = stop
overlap = df[['end', 'i_end']].min(axis=1) - df[['start', 'i_start']].max(axis=1)
df.loc[overlap >= 0, name] = overlap[overlap >= 0]
result = df[list(periods)].idxmax(axis=1)
......应该做的工作(只要你不做一天到下一天的行动)。