根据第二个数据框中的列从一个数据框中选择数据

时间:2019-08-12 21:33:38

标签: pandas dataframe datetime conditional-statements selection

我有一个数据框(df),包含日期时间列的开始日期,结束日期和产品量

如果我想查看一个介于开始日期和结束日期及其总量之间的特定日期,我可以毫无问题地做到这一点(请参见代码)。

但是,如果我创建第二个数据框(称其为报告),则创建一个日期列表以查看第一个df的产品总量,就会出现错误:

  

只能比较标记相同的Series对象

我阅读了第二个df上删除索引或排序日期之类的内容,但是它们似乎不起作用

所以我要求在开始日期和结束日期之间设置数量的工作代码(例如2019年7月1日):

    df[(df['StartDate'] >= '2019-07-01') & (df['EndDate'] <= '2019-10-31')]['Volume'].sum()

但是如果我创建第二个df(报告):

    report = pd.Series(pd.date_range('today', periods=len(df), freq='D').normalize(),name='Date')

    report = pd.DataFrame(report)

并要求我要查看的内容:

    report['trial'] = df[(df['StartDate'] >= report.Date) & (df['EndDate'] <= report.Date)]['Volume'].sum()

遇到此错误:“只能比较标记相同的Series对象”

欢迎任何建议/建议,谢谢!

1 个答案:

答案 0 :(得分:0)

首先,提供一些示例数据:

np.random.seed(42)
dates = pd.date_range('2019-01-01', '2019-12-01', freq='MS')
df = pd.DataFrame({
    'StartDate': dates,
    'EndDate': dates + pd.offsets.MonthEnd(),
    'Volume': np.random.randint(1, 10, len(dates))
})

    StartDate    EndDate  Volume
0  2019-01-01 2019-01-31       7
1  2019-02-01 2019-02-28       4
2  2019-03-01 2019-03-31       8
3  2019-04-01 2019-04-30       5
4  2019-05-01 2019-05-31       7
5  2019-06-01 2019-06-30       3
6  2019-07-01 2019-07-31       7
7  2019-08-01 2019-08-31       8
8  2019-09-01 2019-09-30       5
9  2019-10-01 2019-10-31       4
10 2019-11-01 2019-11-30       8
11 2019-12-01 2019-12-31       8

报告日期:

reports = pd.to_datetime(['2019-01-15', '2019-02-15', '2019-08-15'])

使用numpy的数组广播:

start = df['StartDate'].values
end = df['EndDate'].values
d = reports.values[:, None]
df[np.any((start <= d) & (d <= end), axis=0)]

结果:

   StartDate    EndDate  Volume
0 2019-01-01 2019-01-31       7
1 2019-02-01 2019-02-28       4
7 2019-08-01 2019-08-31       8