通过比较两个不同列中的日期来过滤DataFrame

时间:2019-01-11 18:28:44

标签: python pandas date datetime dataframe

我有一个看起来像这样的数据框:

   Publication Date        Date  Value State
0        2018-12-12  2018-12-11    2.0    AL
1        2018-12-12  2018-12-11    1.0    AZ
2        2018-12-12  2018-12-11    1.0    AK
3        2018-12-12  2018-12-11    2.0    NJ
4        2018-12-12  2018-12-11    1.5    NY
5        2018-12-12  2018-12-12   12.0    AL
6        2018-12-12  2018-12-12   13.0    AZ
7        2018-12-12  2018-12-12   14.0    AK
8        2018-12-12  2018-12-12   12.0    NJ
9        2018-12-12  2018-12-12   11.5    NY
10       2018-12-13  2018-12-12    2.0    AL
11       2018-12-13  2018-12-12    3.0    AZ
12       2018-12-13  2018-12-12    6.0    AK
13       2018-12-13  2018-12-12    1.0    NJ
14       2018-12-13  2018-12-12    4.0    NY

我想删除所有Publication date = Date + 1的地方,所以当Publication Date = 2018-12-12并且Date = 2018-12-11时被丢弃。

它看起来像:

 Publication Date       Date  Value State
       2018-12-12 2018-12-12   12.0    AL
       2018-12-12 2018-12-12   13.0    AZ
       2018-12-12 2018-12-12   14.0    AK
       2018-12-12 2018-12-12   12.0    NJ
       2018-12-12 2018-12-12   11.5    NY

最简单的方法是什么?

3 个答案:

答案 0 :(得分:4)

得到一个面具,用它来过滤df

m = df['Publication Date'].eq(df['Date'] + pd.Timedelta(1, unit='D'))
df[~m]

  Publication Date       Date  Value State
5       2018-12-12 2018-12-12   12.0    AL
6       2018-12-12 2018-12-12   13.0    AZ
7       2018-12-12 2018-12-12   14.0    AK
8       2018-12-12 2018-12-12   12.0    NJ
9       2018-12-12 2018-12-12   11.5    NY

如果“发布日期”和“日期”不是日期时间列,请先使用pd.to_datetime(..., errors='coerce')强制它们。

答案 1 :(得分:1)

使用

df[(df.Publication-df.Date).dt.days!=1]

答案 2 :(得分:0)

为此,请导入timedelta

from datetime import timedelta

首先将date列的数据类型转换为datetime。

df.Date = pd.to_datetime(df.Date)
df["Publication Date"] = pd.to_datetime(df["Publication Date"])

然后过滤数据框

df = df[df["Publication Date"] != df.date + timedelta(days=1)];