【发布时间】:2018-02-23 23:30:15
【问题描述】:
我有一个订阅的 Pandas DataFrame,每个订阅都有一个开始日期时间(时间戳)和一个可选的结束日期时间(如果它们被取消的话)。
为简单起见,我根据开始和结束日期时间(时间戳)为日期创建了字符串列(例如“20170901”)。它看起来像这样:
df = pd.DataFrame([('20170511', None), ('20170514', '20170613'), ('20170901', None), ...], columns=["sd", "ed"])
最终结果应该是在一个范围内的任何给定日期有多少订阅处于活动状态的时间序列。
为此,我为某个范围内的所有日期创建了一个索引:
days = df.groupby(["sd"])["sd"].count()
我能够通过循环创建我感兴趣的内容,每个循环对整个 DataFrame df 执行一个查询。
count_by_day = pd.DataFrame([
len(df.loc[(df.sd <= i) & (df.ed.isnull() | (df.ed > i))])
for i in days.index], index=days.index)
请注意,我在原始数据集中每天都有值,因此没有间隙。我确信可以改进日期范围。
实际的问题是:对于具有数千行的大型初始数据集 df,是否有一种有效的方法来计算它?看来我使用的方法在复杂性上是二次方的。我也试过 df.query() 但它比 Pythonic 过滤器慢 66% 并且不会改变复杂性。
我尝试在 Pandas 文档中搜索示例,但我似乎使用了错误的关键字。有什么想法吗?
【问题讨论】:
标签: python pandas datetime filter aggregate