Python 在数据框设置的范围内计算日期

Python 在数据框设置的范围内计算日期,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个pandas数据框,它包含两个日期列,一个开始日期和一个定义范围的结束日期。我希望能够收集数据框中所有行中所有日期的总计数,如这些列所定义的 例如,该表如下所示: index start_date end date 0 '2015-01-01' '2015-01-17' 1 '2015-01-03' '2015-01-12' 结果将是每个日期的合计,如: date

我有一个pandas数据框,它包含两个日期列,一个开始日期和一个定义范围的结束日期。我希望能够收集数据框中所有行中所有日期的总计数,如这些列所定义的

例如,该表如下所示:

index        start_date         end date
     0         '2015-01-01'    '2015-01-17'
     1         '2015-01-03'    '2015-01-12'
结果将是每个日期的合计,如:

    date           count
'2015-01-01'     1
'2015-01-02'     1
'2015-01-03'     2
等等

我目前的方法可以工作,但在大数据帧上速度非常慢,因为我在各行之间循环,计算范围,然后在此循环。我希望找到更好的方法

目前我正在做:

date = pd.date_range (min (df.start_date), max (df.end_date))
df2 = pd.DataFrame (index =date)
df2 ['count'] = 0

for index, row in df.iterrows ():
    dates = pd.date_range (row ['start_date'], row ['end_date'])
    for date in dates:
        df2.loc['date']['count'] += 1

我认为这里的解决方案是“堆叠”两个日期列,按日期分组,然后进行计数。使用df.stack()函数。以下是我总结出来的一个很好的解决方案:

import datetime
df = pd.DataFrame({'Start' : [datetime.date(2016, 5, i) for i in range(1,30)],
                  'End':[datetime.date(2016, 5, i) for i in range(1,30)]})
df.stack().reset_index()[[0, 'level_1']].groupby(0).count()
我将使用以下方法:

In [76]: df
Out[76]:
      start_date   end_date
index
0     2015-01-01 2015-01-17
1     2015-01-03 2015-01-12
2     2015-01-03 2015-01-17

In [77]: pd.melt(df, value_vars=['start_date','end_date']).groupby('value').size()
Out[77]:
value
2015-01-01    1
2015-01-03    2
2015-01-12    1
2015-01-17    2
dtype: int64

按照@Sam的建议堆叠相关列后,只需使用

编辑:

鉴于您还希望计算开始日期和结束日期之间的日期:

start_dates = pd.to_datetime(df.start_date)
end_dates = pd.to_datetime(df.end_date)

>>> pd.Series(dt.date() for group in 
              [pd.date_range(start, end) for start, end in zip(start_dates, end_dates)]  
              for dt in group).value_counts()
Out[178]: 
2015-01-07    2
2015-01-06    2
2015-01-12    2
2015-01-05    2
2015-01-04    2
2015-01-10    2
2015-01-03    2
2015-01-09    2
2015-01-08    2
2015-01-11    2
2015-01-16    1
2015-01-17    1
2015-01-14    1
2015-01-15    1
2015-01-02    1
2015-01-01    1
2015-01-13    1
dtype: int64

我认为您的解决方案更好+1;)当我在我的大数据集上运行它时,我最初认为这是正确的,但我决定在玩具数据集上测试,以确保我理解。这样做的目的是计算“开始日期”和“结束日期”的实例,但我想做的(以及我在示例中所做的)也是提取“开始日期”和“结束日期”之间的日期,并计算它们。如果开始日期是2015-01-05,结束日期是2015-01-07,那么我仍然想计算2015-01-06,这一方法不适用。好的,我不太清楚。我可以很快修改它。
start_dates = pd.to_datetime(df.start_date)
end_dates = pd.to_datetime(df.end_date)

>>> pd.Series(dt.date() for group in 
              [pd.date_range(start, end) for start, end in zip(start_dates, end_dates)]  
              for dt in group).value_counts()
Out[178]: 
2015-01-07    2
2015-01-06    2
2015-01-12    2
2015-01-05    2
2015-01-04    2
2015-01-10    2
2015-01-03    2
2015-01-09    2
2015-01-08    2
2015-01-11    2
2015-01-16    1
2015-01-17    1
2015-01-14    1
2015-01-15    1
2015-01-02    1
2015-01-01    1
2015-01-13    1
dtype: int64