<p>好吧,在回答的第一部分,我会这样做。。。在</p>
<pre><code>import numpy as np
import pandas as pd
df = pd.DataFrame({
'Employee': ['PersonA', 'PersonB', 'PersonB', 'PersonB', 'PersonC', 'PersonC', 'PersonC', 'PersonC', 'PersonC', 'PersonC'],
'Date': ['1/1/2016', '3/5/2014', '3/1/2015', '3/1/2016', '5/15/2010', '6/3/2011', '3/10/2012', '9/5/2012', '3/1/2013', '3/1/2014'],
'Salary': [50000 , 65000 , 75000 , 100000 , 75000 , 100000 , 110000 , 130000 , 150000 , 200000]
})
df.Date = pd.to_datetime(df.Date)
m = 6
emp_groups = df.groupby('Employee')
df['months_from_start'] = df.Date - emp_groups.Date.transform(min)
df.months_from_start = df.months_from_start.dt.days / 30 // m * m
</code></pre>
<p><code>m</code>可以是任何你想要的。我在计算<code>min</code>日期之间的天数,然后除以一个月内的大致天数,然后进行一点整数除法,将窗口大小“四舍五入”。在</p>
<p>这会给你这样的东西。。。在</p>
^{pr2}$
<p>第二部分有点棘手。我会创建一个新的df和concat到第一个。。。在</p>
<pre><code>last_date_df = emp_groups.last()
last_date_df.months_from_start = (last_date_df.Date - emp_groups.first().Date).dt.days / 30
last_date_df.reset_index(inplace=True)
pd.concat([df, last_date_df], axis=0)
</code></pre>
<p>让你。。。在</p>
<pre><code> Date Employee Salary months_from_start
0 2016-01-01 PersonA 50000 0.000000
1 2014-03-05 PersonB 65000 0.000000
2 2015-03-01 PersonB 75000 12.000000
3 2016-03-01 PersonB 100000 24.000000
4 2010-05-15 PersonC 75000 0.000000
5 2011-06-03 PersonC 100000 12.000000
6 2012-03-10 PersonC 110000 18.000000
7 2012-09-05 PersonC 130000 24.000000
8 2013-03-01 PersonC 150000 30.000000
9 2014-03-01 PersonC 200000 42.000000
0 2016-01-01 PersonA 50000 0.000000
1 2016-03-01 PersonB 100000 24.233333
2 2014-03-01 PersonC 200000 46.200000
</code></pre>