首页 > 解决方案 > 计算给定日期的记录数

问题描述

我曾经有一个 SQL 查询来计算给定日期在给定位置的记录数。

输入数据结构是这样的:id, location, start_date, end_date

import pandas as pd
data = [('20170009003','0681','2017-07-25','2017-08-02'),
('20170009221','0682','2017-07-28','2017-08-02'),
('20170009271','0682','2017-07-31','2017-08-02'),
('20170009286','0681','2017-07-18','2017-09-19'),
('20170009654','0682','2017-07-28','2017-08-03'),
('20170010053','0681','2017-07-31','2017-08-04'),
('20170010059','0681','2017-07-20','2017-08-07')]
labels = ['idnum','loc','start_date','end_date']
df = pd.DataFrame.from_records(data, columns=labels)

这会给我在给定日期的(在场)人数。即“2018-08-01”,将得到:

2018-08-01, 0681, 4
2018-08-01, 0682, 3

我想用 python/pandas 产生类似的结果。

如果有任何帮助,用于实现上述目标的 sql(postgreql 函数)是:

CREATE OR REPLACE FUNCTION nb_present(oneday date)
 RETURNS TABLE(ddj date, loc character, eff numeric)
 LANGUAGE sql
AS $function$
SELECT $1, loc,sum(case when ($1= start_date and start_date_end_date) then 1 
                when $1=start_date then 0.5 
                when $1=end_date then 0.5 
                when ($1 > start_date and $1 < end_date) then 1 
                else 0 end)
from passage group by 1,2 order by 1,2;
$function$

谢谢你的帮助。

PS:这是我在这里的第一篇文章。

标签: pythonsqlpandasdatecount

解决方案


我相信这就是你正在寻找的(确保你的startdateenddate是熊猫Datetime对象):

dt = pd.to_datetime('2018-08-01')
df1 = df[(df['startdate'] > dt) & (df['enddate'] < dt)].groupby('loc').count().to_frame()
df1['Date'] = dt

推荐阅读