gpt4 book ai didi

python - 在 Pandas DataFrame 中查找连续日期组

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:20 26 4
gpt4 key购买 nike

我正在尝试从 Pandas DataFrame 中获取具有连续日期的数据 block 。我的 df 如下所示。

      DateAnalyzed           Val
1 2018-03-18 0.470253
2 2018-03-19 0.470253
3 2018-03-20 0.470253
4 2018-09-25 0.467729
5 2018-09-26 0.467729
6 2018-09-27 0.467729

在这个 df 中,我想获取前 3 行,进行一些处理,然后获取最后 3 行并对其进行处理。

我通过应用以下代码计算了 1 个滞后的差异。

df['Delta']=(df['DateAnalyzed'] - df['DateAnalyzed'].shift(1))

但在那之后我无法弄清楚如何在不迭代的情况下获取连续行的组。

最佳答案

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

还有一个棘手的部分可以通过示例充实。请注意,下面的 df 包含一个添加的行,该行前后没有任何连续的日期。

>>> df
DateAnalyzed Val
1 2018-03-18 0.470253
2 2018-03-19 0.470253
3 2018-03-20 0.470253
4 2017-01-20 0.485949 # < watch out for this
5 2018-09-25 0.467729
6 2018-09-26 0.467729
7 2018-09-27 0.467729

>>> df.dtypes
DateAnalyzed datetime64[ns]
Val float64
dtype: object

下面的答案假定您想要完全忽略 2017-01-20,而不对其进行处理。 (如果您确实要处理此日期,请参阅解决方案的答案结尾。)

首先:

>>> dt = df['DateAnalyzed']
>>> day = pd.Timedelta('1d')
>>> in_block = ((dt - dt.shift(-1)).abs() == day) | (dt.diff() == day)
>>> in_block
1 True
2 True
3 True
4 False
5 True
6 True
7 True
Name: DateAnalyzed, dtype: bool

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

下一步是自己推导分组:

>>> filt = df.loc[in_block]
>>> breaks = filt['DateAnalyzed'].diff() != day
>>> groups = breaks.cumsum()
>>> groups
1 1
2 1
3 1
5 2
6 2
7 2
Name: DateAnalyzed, dtype: int64

然后您可以使用您选择的操作调用df.groupby(groups)

>>> for _, frame in filt.groupby(groups):
... print(frame, end='\n\n')
...
DateAnalyzed Val
1 2018-03-18 0.470253
2 2018-03-19 0.470253
3 2018-03-20 0.470253

DateAnalyzed Val
5 2018-09-25 0.467729
6 2018-09-26 0.467729
7 2018-09-27 0.467729

要将其合并回 df,分配给它,隔离日期将为 NaN:

>>> df['groups'] = groups
>>> df
DateAnalyzed Val groups
1 2018-03-18 0.470253 1.0
2 2018-03-19 0.470253 1.0
3 2018-03-20 0.470253 1.0
4 2017-01-20 0.485949 NaN
5 2018-09-25 0.467729 2.0
6 2018-09-26 0.467729 2.0
7 2018-09-27 0.467729 2.0

如果您确实想包括“单独”的日期,事情会变得更简单一些:

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

关于python - 在 Pandas DataFrame 中查找连续日期组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52901387/

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