开始日期和结束日期之间每周的熊猫元素



我从一个有开始日期和结束日期的数据帧开始,例如:

ID START       END         A
0  2014-04-09  2014-04-15  5
1  2018-06-05  2018-07-01  8 
2  2018-06-05  2018-07-01  7

我试图找出,每一周,有多少元素在那一点上开始但没有结束。例如,在上面的DF中:

Week-Monday N
2014-04-07  1
2014-04-14  1
2014-04-21  0
...
2018-06-04  2
...

下面这样的东西不太管用,因为它只在结束日期重新采样:

df = df.resample("W-Mon", on="END").sum()

我不知道如何综合这两个条件:事件发生在开始日期之后,但在结束日期之前。

您可以从这里开始:

import pandas as pd
df = pd.DataFrame({'ID':[0,1,2], 
'START':['2014-04-09', '2018-06-05', '2018-06-05'],
'END':['2014-04-15', '2018-07-01', '2018-07-01'],
'A':[5,8,7]})

1-查找每个SRART和每个END的周数,然后查找Week-Monday

import datetime, time
from datetime import timedelta
df.loc[:,'startWeek'] = df.START.apply(lambda x: datetime.datetime.strptime(x,'%Y-%m-%d').isocalendar()[1])
df.loc[:,'endWeek'] = df.END.apply(lambda x: datetime.datetime.strptime(x,'%Y-%m-%d').isocalendar()[1])
df.loc[:, 'Week-Monday'] = df.START.apply(lambda x: datetime.datetime.strptime(x,'%Y-%m-%d')- timedelta(days=datetime.datetime.strptime(x,'%Y-%m-%d').weekday()))

2-检查它们是否相同,如果是,则在同一周内结束。

def endedNotSameWeek(row):
if row['startWeek']!=row['endWeek']:
return 1
return 0
df.loc[:,'NotSameWeek'] = df.apply(endedNotSameWeek, axis=1)
print(df)

输出:

ID       START         END  A  startWeek  endWeek Week-Monday  NotSameWeek
0   0  2014-04-09  2014-04-15  5         15       16  2014-04-07            1
1   1  2018-06-05  2018-07-01  8         23       26  2018-06-04            1
2   2  2018-06-05  2018-07-01  7         23       26  2018-06-04            1

3-Groupby每个Week-Monday得到的病例数在同一周内没有结束。

df.groupby('Week-Monday')['NotSameWeek'].agg({'N':'sum'}).reset_index()
Week-Monday  N
0  2014-04-07  1
1  2018-06-04  2

最新更新