计算由熊猫数据框设置的范围内的日期

ant*_*thr 3 python dataframe pandas

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

例如,该表如下所示:

index        start_date         end date
     0         '2015-01-01'    '2015-01-17'
     1         '2015-01-03'    '2015-01-12'
Run Code Online (Sandbox Code Playgroud)

结果将是每个日期的聚合,例如:

    date           count
'2015-01-01'     1
'2015-01-02'     1
'2015-01-03'     2
Run Code Online (Sandbox Code Playgroud)

等等。

我目前的方法有效,但在大数据帧上非常慢,因为我在行之间循环,计算范围,然后循环遍历。我希望找到更好的方法。

目前我正在做:

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
Run Code Online (Sandbox Code Playgroud)

Ale*_*der 6

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

df[['start_date', 'end date']].stack().value_counts()
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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
Run Code Online (Sandbox Code Playgroud)