pandas 如何排除日期不按升序排列的行

mznpcxlj  于 2023-05-21  发布在  其他
关注(0)|答案(1)|浏览(135)

我有一个.xlxs文件,可以从here访问。这个文件只是我所拥有的一个小概念,因为我有一个更大的文件,我需要处理。
列日期有点混乱,有一些错别字,其中在列“日期”中有一个数字是2018年,而由于错别字,第6行中的2017年被写了出来。第12行和第13行也是如此,其中的年份是2010年,但它们应该是2019年。我想检查一下,日期是按照年份升序排列的,如果不是,那么这些日期沿着相应的行应该被删除。因此,基本上我想省略那些看起来没有按照年份升序排列的行。
我已经包含了一个snippet,我想在python上结束。

增编

下面是一些清理日期后打印出数据的代码。ts[0]是包含“dates.xlsx”中的数据的文件(Google Drive上的文件)

date_output_ts = pd.to_datetime(ts[0], dayfirst=True, errors='coerce').dropna()

print(date_output_ts)

然后我简单地转换成一个数组:

x_array = np.asarray(date_output_ts)

得到如下的here
然后我画出x_array,得到这个figure。Y轴是年份。你看到的下跌是我试图删除的9个单独的错误。

lp0sw83n

lp0sw83n1#

你可以在diff中使用布尔索引:

diff = df['Date'].diff()
out = df.loc[pd.Series(np.select([diff.lt('0'), diff.ge('365days')],
                                 [False, True], np.nan),
                       index=df.index).ffill().ne(0)]

输出:

Date  Mean  N Mean  N SD
0  2018-05-16  89.0    94.0  22.5
1  2018-05-17  92.0    94.9  22.5
2  2018-05-18  93.7    94.6  22.6
3  2018-05-19  93.0    94.6  22.3
5  2018-05-21  95.0    95.0  22.6
6  2018-05-22  91.0    94.0  22.3
7  2019-05-25  88.0    94.3  22.5
8  2019-05-26  93.8    94.6  22.5
9  2019-05-27  88.0    94.3  22.5
12 2019-05-26  93.8    94.6  22.5
13 2019-05-27  88.0    94.3  22.5
14 2020-05-26  93.8    94.6  22.5
15 2020-05-27  88.0    94.3  22.5
16 2020-05-28  93.8    94.6  22.5
17 2020-05-29  88.0    94.3  22.5
18 2020-05-30  93.8    94.6  22.5

中间体:

Date  Mean  N Mean  N SD       diff  indexer
0  2018-05-16  89.0    94.0  22.5        NaT     True
1  2018-05-17  92.0    94.9  22.5     1 days     True
2  2018-05-18  93.7    94.6  22.6     1 days     True
3  2018-05-19  93.0    94.6  22.3     1 days     True
4  2017-05-20  94.0    94.6  22.6  -364 days    False
5  2018-05-21  95.0    95.0  22.6   366 days     True
6  2018-05-22  91.0    94.0  22.3     1 days     True
7  2019-05-25  88.0    94.3  22.5   368 days     True
8  2019-05-26  93.8    94.6  22.5     1 days     True
9  2019-05-27  88.0    94.3  22.5     1 days     True
10 2010-05-22  91.0    94.0  22.3 -3292 days    False
11 2010-05-25  88.0    94.3  22.5     3 days    False
12 2019-05-26  93.8    94.6  22.5  3288 days     True
13 2019-05-27  88.0    94.3  22.5     1 days     True
14 2020-05-26  93.8    94.6  22.5   365 days     True
15 2020-05-27  88.0    94.3  22.5     1 days     True
16 2020-05-28  93.8    94.6  22.5     1 days     True
17 2020-05-29  88.0    94.3  22.5     1 days     True
18 2020-05-30  93.8    94.6  22.5     1 days     True
替代

您也可以尝试获取日期的cummax,如果是向后的,则忽略日期,直到您高于之前的最大值:

out = df.loc[df[0].ge(df[0].cummax())]

视觉输出:

相同,但仅根据年份进行过滤:

out = df.loc[df[0].dt.year.ge(df[0].dt.year.cummax())]

视觉输出:

如果只考虑年份,第一个橙子峰值并不是异常:

308 2019-09-30    3 days
309 2019-10-31   31 days
310 2019-02-10 -263 days  # this is the same year
311 2019-04-10   59 days
312 2019-10-07  180 days
313 2019-10-08    1 days

相关问题