似乎需要两个布尔掩码:一个用于确定组之间的间隔,另一个用于确定哪个日期首先在组中。
还有一个棘手的部分可以通过示例来充实。请注意,
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()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)