gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:35:56 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com