给定开始日期和结束日期,在 Pandas 中查找日期计数

数据挖掘 Python 熊猫
2021-10-10 03:49:57

我有以下格式的熊猫 df(NoOFDays 是 EndDate - StartDate)

------------------------------------------
|Item | StartDate | EndDate    | NoOFDays|
------------------------------------------
| A |  01-Jan-2018| 04-Jan-2018|    4    |
| A |  07-Jan-2018| 08-Jan-2018|    2    |
| B |  03-Jan-2018| 05-Jan-2018|    3    |
| A |  03-Jan-2018| 05-Jan-2018|    3    |
------------------------------------------

并希望获得按项目分组的每一天的计数

A 01-Jan-2018 1
A 02-Jan-2018 1
A 03-Jan-2018 2
A 04-Jan-2018 2
A 05-Jan-2018 1
A 06-Jan-2018 0
A 07-Jan-2018 1
A 08-Jan-2018 1
B 01-Jan-2018 0
B 02-Jan-2018 0
B 03-Jan-2018 1
B 04-Jan-2018 1
B 05-Jan-2018 1
B 06-Jan-2018 0
B 07-Jan-2018 0
B 08-Jan-2018 0
2个回答

试试这个。这有点难看,因为如果不遍历其中一个数据框,我无法获得解决方案。可以通过迭代原始数据或带有所有日期列表的新 df 来完成。

我有一个类似的问题,任何更清洁的方法将不胜感激。

import pandas as pd

df = pd.DataFrame(data={'Item':['A','A','B','A'], 
                        'StartDate':['2018-01-01','2018-01-07', '2018-01-03','2018-01-03'],
                        'EndDate': ['2018-01-04','2018-01-08','2018-01-05','2018-01-05']})
df['StartDate'] = pd.to_datetime(df['StartDate'])
df['EndDate'] = pd.to_datetime(df['EndDate'])


index = pd.MultiIndex.from_product([['A','B'],pd.date_range(start = df.StartDate.min(), end = df.EndDate.max())], names=['item', 'date'])
new_df = pd.DataFrame(index = index, data = {'counts':0})

dates_list = new_df.index.get_level_values(1)
items_list = new_df.index.get_level_values(0)
for row in df.itertuples():
  new_df.counts[(items_list == row.Item) & (dates_list>=row.StartDate) & (dates_list<= row.EndDate)] += 1

print(new_df)

这给出了这个。如果需要,您可以稍后删除多索引

                 counts
item date              
A    2018-01-01       1
     2018-01-02       1
     2018-01-03       2
     2018-01-04       2
     2018-01-05       1
     2018-01-06       0
     2018-01-07       1
     2018-01-08       1
B    2018-01-01       0
     2018-01-02       0
     2018-01-03       1
     2018-01-04       1
     2018-01-05       1
     2018-01-06       0
     2018-01-07       0
     2018-01-08       0

您正在寻找的是具有多列的 groupby 。根据此示例,您的 pandas groupby 将如下所示:

df.groupby(['Item', 'StartDate']).agg(['count'])