python - 从具有日期范围的 DataFrame 创建 Pandas 每日聚合时间序列

标签 python pandas datetime filter aggregate

我有一个 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 文档中搜索示例,但我似乎使用了错误的关键字。有什么想法吗?

最佳答案

这是一个有趣的问题,我将这样做。不确定性能

编辑:我的第一个答案不正确,我没有完全阅读问题

# Initial data, columns as Timestamps
df = pd.DataFrame([('20170511', None), ('20170514', '20170613'), ('20170901', None)], columns=["sd", "ed"])
df['sd'] = pd.DatetimeIndex(df.sd)
df['ed'] = pd.DatetimeIndex(df.ed)

# Range input and related index
beg = pd.Timestamp('2017-05-15')
end = pd.Timestamp('2017-09-15')
idx = pd.DatetimeIndex(start=beg, end=end, freq='D')

# We filter data for records out of the range and then clip the 
# the subscriptions start/end to the range bounds.
fdf = df[(df.sd <= beg) | ((df.ed >= end) | (pd.isnull(df.ed)))]
fdf['ed'].fillna(end, inplace=True)
fdf['ps'] = fdf.sd.apply(lambda x: max(x, beg))
fdf['pe'] = fdf.ed.apply(lambda x: min(x, end))

# We run a conditional count
idx.to_series().apply(lambda x: len(fdf[(fdf.ps<=x) & (fdf.pe >=x)]))

关于python - 从具有日期范围的 DataFrame 创建 Pandas 每日聚合时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46228276/

相关文章:

python - pymongo错误名称 'ISODate'未定义

python - 如果没有为 io 传入缓冲区或路径,则必须显式设置引擎

python - 如何从 Dataframe 指定日期时间中的年、月、日?

python - 拒绝负数作为 Python 中的异常

python - 根据 python/pandas 数据框中单元格的文本内容选择(非索引)列

python - 减少校准中的测量次数

pandas - 在多列中查找字符串?

python - Pandas 分组日期范围

ruby-on-rails - rails + ActiveRecord : comparing dates

javascript - 使用 AngularJS slider 获取日期输入作为范围