【问题标题】:How to delete rows with less than 3 consecutive date values in the Dataframe如何删除数据框中连续日期值少于 3 个的行
【发布时间】:2019-08-11 05:29:02
【问题描述】:

在来这里问你之前,我在互联网和文档中搜索了很多。

我的问题如下:

我有一个这样的数据框:

                   date    dir   vel
0   2006-02-12 17:00:00 181.00  3.92
1   2006-02-12 19:00:00 17.88   5.10
2   2006-02-12 21:00:00 214.75  3.73
3   2006-02-13 00:00:00 165.53  2.16
4   2006-02-13 01:00:00 189.44  2.94
5   2006-02-13 04:00:00 152.88  2.55
6   2006-02-13 05:00:00 188.03  3.73
7   2006-02-13 06:00:00 158.50  1.37
8   2006-02-13 07:00:00 189.44  2.55
9   2006-02-13 08:00:00 152.88  1.37
10  2006-02-13 10:00:00 109.28  0.20
11  2006-02-13 11:00:00 248.50  0.98
12  2006-02-13 12:00:00 26.31   1.96
13  2006-02-13 13:00:00 19.28   6.08
14  2006-02-13 14:00:00 334.28  3.53
15  2006-02-13 15:00:00 338.50  2.75
16  2006-02-13 16:00:00 318.81  3.92
17  2006-02-13 17:00:00 323.03  3.73
18  2006-02-13 21:00:00 62.88   1.76
19  2006-02-13 22:00:00 188.03  2.94

我只需要找到连续日期的序列并删除持续时间少于 3 个日期的连续日期序列。所以我会得到以下数据框:

                   date    dir   vel
5   2006-02-13 04:00:00 152.88  2.55
6   2006-02-13 05:00:00 188.03  3.73
7   2006-02-13 06:00:00 158.50  1.37
8   2006-02-13 07:00:00 189.44  2.55
9   2006-02-13 08:00:00 152.88  1.37  
10  2006-02-13 10:00:00 109.28  0.20
11  2006-02-13 11:00:00 248.50  0.98
12  2006-02-13 12:00:00 26.31   1.96
13  2006-02-13 13:00:00 19.28   6.08
14  2006-02-13 14:00:00 334.28  3.53
15  2006-02-13 15:00:00 338.50  2.75
16  2006-02-13 16:00:00 318.81  3.92
17  2006-02-13 17:00:00 323.03  3.73

到目前为止,我使用了以下脚本(灵感来自这个答案:Find group of consecutive dates in Pandas DataFrame

(obs:DataFrame名称是estreito):

dt = estreito['date']
hour = pd.Timedelta('1H')
in_block = ((dt - dt.shift(-1)).abs() == hour) | (dt.diff() == hour)

filt = estreito.loc[in_block]
breaks = filt['date'].diff() != hour
groups = breaks.cumsum()

for _, frame in filt.groupby(groups):
    print(frame, end='\n\n')

打印输出是这样的:

                 date     dir   vel
3 2006-02-13 00:00:00  165.53  2.16
4 2006-02-13 01:00:00  189.44  2.94

                 date     dir   vel
5 2006-02-13 04:00:00  152.88  2.55
6 2006-02-13 05:00:00  188.03  3.73
7 2006-02-13 06:00:00  158.50  1.37
8 2006-02-13 07:00:00  189.44  2.55
9 2006-02-13 08:00:00  152.88  1.37

                  date     dir   vel
10 2006-02-13 10:00:00  109.28  0.20
11 2006-02-13 11:00:00  248.50  0.98
12 2006-02-13 12:00:00   26.31  1.96
13 2006-02-13 13:00:00   19.28  6.08
14 2006-02-13 14:00:00  334.28  3.53
15 2006-02-13 15:00:00  338.50  2.75
16 2006-02-13 16:00:00  318.81  3.92
17 2006-02-13 17:00:00  323.03  3.73

如何将输出保存在新的 Dataframe 中,过滤连续日期少于 3 个的组。

有不同的方法来做这个分析吗?也许有更简单的方法来获得所需的结果。

提前致谢。

【问题讨论】:

    标签: python-3.x pandas dataframe jupyter-notebook pandas-groupby


    【解决方案1】:

    我们使用diffcumsum 创建key

    s=df.date.diff().dt.seconds.ne(60*60).cumsum()
    

    然后使用transformcount创建新密钥,并切片原始df

    df[s.groupby(s).transform('count').gt(3)]
    Out[983]: 
                      date     dir   vel
    5  2006-02-13 04:00:00  152.88  2.55
    6  2006-02-13 05:00:00  188.03  3.73
    7  2006-02-13 06:00:00  158.50  1.37
    8  2006-02-13 07:00:00  189.44  2.55
    9  2006-02-13 08:00:00  152.88  1.37
    10 2006-02-13 10:00:00  109.28  0.20
    11 2006-02-13 11:00:00  248.50  0.98
    12 2006-02-13 12:00:00   26.31  1.96
    13 2006-02-13 13:00:00   19.28  6.08
    14 2006-02-13 14:00:00  334.28  3.53
    15 2006-02-13 15:00:00  338.50  2.75
    16 2006-02-13 16:00:00  318.81  3.92
    17 2006-02-13 17:00:00  323.03  3.73
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 2021-02-22
      相关资源
      最近更新 更多