【发布时间】:2017-05-04 21:26:35
【问题描述】:
我有一个不同人的工作数据框,每个工作都有星级和结束时间。我想每四个月计算一次,每个人负责多少工作。我想办法做到这一点,但我确信它的效率非常低(我是熊猫的新手)。当我在完整的数据集(数百人和工作)上运行代码时,计算需要相当长的时间。
这是我目前所拥有的。
#create a data frame
import pandas as pd
import numpy as np
df = pd.DataFrame({'job': pd.Categorical(['job1','job2','job3','job4']),
'person': pd.Categorical(['p1', 'p1', 'p2','p2']),
'start': ['2015-01-01', '2015-06-01', '2015-01-01', '2016- 01- 01'],
'end': ['2015-07-01', '2015- 12-31', '2016-03-01', '2016-12-31']})
df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])
这给了我
然后我创建一个新的数据集
bdate = min(df['start'])
edate = max(df['end'])
dates = pd.date_range(bdate, edate, freq='4MS')
people = sorted(set(list(df['person'])))
df2 = pd.DataFrame(np.zeros((len(dates), len(people))), index=dates, columns=people)
for d in pd.date_range(bdate, edate, freq='MS'):
for p in people:
contagem = df[(df['person'] == p) &
(df['start'] <= d) &
(df['end'] >= d)]
pos = np.argmin(np.abs(dates - d))
df2.iloc[pos][p] = len(contagem.index)
df2
我得到了
我确信必须有更好的方法来执行此操作,而不必遍历所有日期和人员。但是怎么做呢?
【问题讨论】:
-
您的问题表明您希望每季度输出一次,但您的示例代码和输出每三年完成一次。你要哪一个?
-
意味着每 4 个月一次。修复了问题