Python 每个组的特定天数之间经过的天数
从下面的数据框中,我想计算每年每个事件发生前的天数Python 每个组的特定天数之间经过的天数,python,pandas,Python,Pandas,从下面的数据框中,我想计算每年每个事件发生前的天数 lst = [['2011-02-01',''], ['2011-02-02',''], ['2011-02-03',''], ['2011-02-04','event1'], ['2011-02-05',''], ['2011-02-06','event_2'], ['2012-02-01',''], ['2012-02-02','
lst = [['2011-02-01',''],
['2011-02-02',''],
['2011-02-03',''],
['2011-02-04','event1'],
['2011-02-05',''],
['2011-02-06','event_2'],
['2012-02-01',''],
['2012-02-02',''],
['2012-02-03',''],
['2012-02-04',''],
['2012-02-05','event_1'],
['2012-02-06','event_2']]
df = pd.DataFrame(lst,columns=['date','event'])
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
所需的输出类似于以下内容:
尝试:
将numpy作为np导入
df=df。分配事件发生前的天数\u 1=None,事件发生前的天数\u 2=None
历元系数=24*60*60*10**9
对于df[年份]中的y。唯一:
dfel=df.loc[df[年].eqy]
dfel=dfel.iloc[:-1]
dfel[days\u to_event\u 1]=np.wheredfel[event].eqevent\u 1,dfel[date].astypestr,无
dfel[days\u Un\u event\u 1]=pd.to\u datetimedfel[days\u Un\u event\u 1].ffill.bfill dfel[date]
dfel[days\u Un\u event\u 2]=np.wheredfel[event]。eqevent\u 2,dfel[date]。astypestr,None
dfel[days\u Un\u event\u 2]=pd.to\u datetimedfel[days\u Un\u event\u 2].ffill.bfill dfel[date]
df.loc[df[year].eqy[事件1前的天数,事件2前的天数]=dfel[[事件1前的天数,事件2前的天数]].divepoch
产出:
>>>df.iloc[:,-2:]
距离事件1天距离事件2天
0 3 5
1 2 4
2 1 3
3 0 2
4 -1 1
5 -2 0
6 4 5
7 3 4
8 2 3
9 1 2
10 0 1
11 -1 0
lst = [['2011-02-01',''],
['2011-02-02',''],
['2011-02-03',''],
['2011-02-04','event_1'],
['2011-02-05',''],
['2011-02-06','event_2'],
['2012-02-01',''],
['2012-02-02',''],
['2012-02-03',''],
['2012-02-04',''],
['2012-02-05','event_1'],
['2012-02-06','event_2']]
df = pd.DataFrame(lst,columns=['date','event'])
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
#### utility functions ####
def count_down(event, code):
results = []
i = -1
partial = []
for e in np.asarray(event):
if e == code:
partial.append(i+1)
results.extend(partial[::-1])
partial = []
i = -1
else:
i += 1
partial.append(i)
results.extend(partial[::-1])
return results
def reverse_count_down(event, code):
results = []
i = 0
partial = []
for e in np.asarray(event):
if e == code:
partial.append(i+1)
results.extend(partial)
partial = []
i = 0
else:
i += 1
partial.append(i)
results.extend(partial)
return results
df['days_until_event1'] = count_down(df.event, 'event_1')
df['days_until_event2'] = count_down(df.event, 'event_2')
# insert nevative values
c_down = np.asarray(reverse_count_down(df.event, 'event_1'))
substitute = np.where(df.days_until_event1>=df.days_until_event2)[0]
df.loc[substitute, 'days_until_event1'] = -c_down[substitute]
df