Pandas groupby与正则表达式捕获序列中不需要的元素

时间:2017-11-27 09:22:43

标签: python pandas datetime pandas-groupby

这是我第一次发帖,所以我希望这有足够的文件来解释我所遇到的问题。

我正在处理25年多的NOAA风向和速度数据,我已经清理并加载到Pandas数据框中。我能够按月成功地对数据进行排序,使用以下方法将我的结果与每年的7月分开:

in: july_df = df[df['date'].str.contains('\d{4}\-(7|07)', regex=True)]
in: july_df.head(5)
Out: 
             date   time  direction  speed
24732  1992-07-01  00:00      128.0    4.1
24733  1992-07-01  00:10      120.0    3.3
24734  1992-07-01  00:20      117.0    3.2
24735  1992-07-01  00:30      108.0    3.1
24736  1992-07-01  00:40      112.0    2.9

然而,当我试图进一步隔离数据时,只按每月7月份的数据进行分组,我从第一天开始就得到一些读数,这些读数的数量似乎根据数量而变化我想一次查看的条目。在这里,我试着在7月14日分组:

in: july_14 = july_df.groupby(df.date.str.contains("\d{4}\-07\-14", regex=True))
in: july_14.head(5)
out: 
             date   time  direction  speed
24732  1992-07-01  00:00      128.0    4.1
24733  1992-07-01  00:10      120.0    3.3
24734  1992-07-01  00:20      117.0    3.2
24735  1992-07-01  00:30      108.0    3.1
24736  1992-07-01  00:40      112.0    2.9
26532  1992-07-14  00:00       91.0    4.3
26533  1992-07-14  00:10       82.0    4.2
26534  1992-07-14  00:20       78.0    4.6
26535  1992-07-14  00:30       73.0    4.6
26536  1992-07-14  00:40       71.0    4.2

我预计我之前的分组只输出与7月14日相关的结果,这是我想要更密切分析的日期。

我认为问题出在我正在使用的正则表达式中。例如,如果我将输入更改为不在数据集中的日期(7月32日),我仍会得到7月1日的结果:

in: july_14 = july_df.groupby(df.date.str.contains("\d{4}\-07\-32", regex=True))
in: july_14.head()
out: 
             date   time  direction  speed
24732  1992-07-01  00:00      128.0    4.1
24733  1992-07-01  00:10      120.0    3.3
24734  1992-07-01  00:20      117.0    3.2
24735  1992-07-01  00:30      108.0    3.1
24736  1992-07-01  00:40      112.0    2.9

当我按年分组时,我甚至得到了这种不稳定的结果:

print july_df.groupby(july_df.date.str.contains("2001", regex=True)).head(5)
              date   time  direction  speed
24732   1992-07-01  00:00      128.0    4.1
24733   1992-07-01  00:10      120.0    3.3
24734   1992-07-01  00:20      117.0    3.2
24735   1992-07-01  00:30      108.0    3.1
24736   1992-07-01  00:40      112.0    2.9
374667  2001-07-01  00:00       96.0    4.7
374668  2001-07-01  00:10       98.0    5.1
374669  2001-07-01  00:20      100.0    5.4
374670  2001-07-01  00:30       97.0    5.3
374671  2001-07-01  00:40       83.0    5.1

有谁可以指出我的错误?

感谢您的帮助。如果记录不充分或重复问题,请告诉我。

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方法,首先过滤所需的日期,然后再分组

july_df[july_df['date'].str.contains('\d{4}-07-14')].groupby(['date','time']).agg(['count'])