栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Pandas DataFrame中查找连续日期组

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Pandas DataFrame中查找连续日期组

似乎需要两个布尔掩码:一个用于确定组之间的间隔,另一个用于确定哪个日期首先在组中。

还有一个棘手的部分可以通过示例来充实。请注意,

df
下面包含一个添加的行,该行之前或之后没有任何连续的日期。

>>> df  DateAnalyzed       Val1   2018-03-18  0.4702532   2018-03-19  0.4702533   2018-03-20  0.4702534   2017-01-20  0.485949  # < watch out for this5   2018-09-25  0.4677296   2018-09-26  0.4677297   2018-09-27  0.467729>>> df.dtypesDateAnalyzed    datetime64[ns]Val         float64dtype: object

以下答案假定您要

2017-01-20
完全忽略而不处理它。(如果您确实想处理此日期,请参阅答案的结尾以获取解决方案。)

第一:

>>> dt = df['DateAnalyzed']>>> day = pd.Timedelta('1d')>>> in_block = ((dt - dt.shift(-1)).abs() == day) | (dt.diff() == day)>>> in_block1     True2     True3     True4    False5     True6     True7     TrueName: DateAnalyzed, dtype: bool

现在,

in_block
将告诉您哪些日期在“连续”块中,但不会告诉您每个日期属于哪些组。

下一步是推导分组本身:

>>> filt = df.loc[in_block]>>> breaks = filt['DateAnalyzed'].diff() != day>>> groups = breaks.cumsum()>>> groups1    12    13    15    26    27    2Name: DateAnalyzed, dtype: int64

然后,您可以

df.groupby(groups)
选择进行呼叫。

>>> for _, frame in filt.groupby(groups):...     print(frame, end='nn')...   DateAnalyzed       Val1   2018-03-18  0.4702532   2018-03-19  0.4702533   2018-03-20  0.470253  DateAnalyzed       Val5   2018-09-25  0.4677296   2018-09-26  0.4677297   2018-09-27  0.467729

要将其合并回去

df
,分配给它,隔离的日期将是
NaN

>>> df['groups'] = groups>>> df  DateAnalyzed       Val  groups1   2018-03-18  0.470253     1.02   2018-03-19  0.470253     1.03   2018-03-20  0.470253     1.04   2017-01-20  0.485949     NaN5   2018-09-25  0.467729     2.06   2018-09-26  0.467729     2.07   2018-09-27  0.467729     2.0

如果您确实想包含“孤独”日期,事情将变得更加简单:

dt = df['DateAnalyzed']day = pd.Timedelta('1d')breaks = dt.diff() != daygroups = breaks.cumsum()


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/661143.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号