熊猫筛选日期

时间:2019-11-17 19:04:25

标签: python pandas

我有一个如下数据框,

+-----------+-------+----------+--+--+
| Date      | OPP   | Result   |  |  |
+-----------+-------+----------+--+--+
| Sat 11/16 | @DAL  | L110-102 |  |  |
+-----------+-------+----------+--+--+
| Wed 11/13 | @POR  | W114-106 |  |  |
+-----------+-------+----------+--+--+
| Mon 11/11 | @LAC  | L98-88   |  |  |
+-----------+-------+----------+--+--+
| Sun 11/10 | @LAL  | W113-104 |  |  |
+-----------+-------+----------+--+--+
| Fri 11/8  | @NO   | W122-104 |  |  |
+-----------+-------+----------+--+--+
| Wed 11/6  | vsSAC | W124-120 |  |  |
+-----------+-------+----------+--+--+
| Sat 11/2  | @MIL  | L115-105 |  |  |
+-----------+-------+----------+--+--+

我正在尝试过滤> _____的日期。

这就是我尝试过的方法,但是并没有过滤大于Sun 11/10的所有日期

d1 = d1[(d1['Date'] > 'Sun 11/10')]

更新

我的专栏现在看起来像这样,我需要能够过滤New_Date> _____并排除“ NaT”。尝试d1[(d1['New_Date'] > '2019-11-01')]但不起作用。

0    2019-11-20
1    2019-11-18
2    2019-11-16
3    2019-11-13
4    2019-11-11
5    2019-11-10
6    2019-11-08
7    2019-11-06
8    2019-11-02
9    2019-11-01
10   2019-10-30
11   2019-10-28
12   2019-10-26
13   2019-10-01
14          NaT
15          NaT
16   2019-10-18
17   2019-10-13
18   2019-10-10
19   2019-10-08
20          NaT
21          NaT

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

首先,您需要将日期转换为正确的datetime对象,并提供正确的输入格式(我假设为<weekday> <month>/<day>-您可以根据datetime文档进行调整:{{3 }})。您可以通过以下方式进行操作:

df["Date_2"]=pd.to_datetime(df["Date"].astype(str), format="%a %m/%d")

然后使用python datetime.strptime()方法对过滤条件进行类比转换:

from datetime import datetime

df.loc[df["Date_2"]>datetime.strptime("Thu 11/12", "%a %m/%d")]

整个示例:

import pandas as pd
from datetime import datetime

df=pd.DataFrame({"Date": ["Sat 11/16", "Fri 11/8", "Wed 11/13"], "x": [4,3,7]})


df["Date_2"]=pd.to_datetime(df["Date"].astype(str), format="%a %m/%d")
print("\nExample filtered: ")
print(df.loc[df["Date_2"]>datetime.strptime("Thu 11/12", "%a %m/%d")])
print("\nThe whole thing:")
print(df)

并输出:

Example filtered:
        Date  x     Date_2
0  Sat 11/16  4 1900-11-16
2  Wed 11/13  7 1900-11-13

The whole thing:
        Date  x     Date_2
0  Sat 11/16  4 1900-11-16
1   Fri 11/8  3 1900-11-08
2  Wed 11/13  7 1900-11-13

(由于未提供年份,因此假定为1900

答案 1 :(得分:1)

您是否愿意将格式更改为另一种格式,或者是否有一个单独的列,其日期可由收藏家搜索?我写了这个解决方案,展示了这条路线,也许它将帮助您提出想法,并且我愿意提出更改建议:

newdf = pd.read_csv('testdata2.csv', parse_dates=["Date"], date_parser=lambda x: pd.to_datetime(x, format="%a %m/%d"), 
index_col="Date") 

newdf = newdf.reset_index()   
newdf['Date'] = newdf['Date'].mask(newdf['Date'].dt.year == 1900, newdf['Date'] + pd.offsets.DateOffset(year=2019))

newdf[(newdf['Date'] > '2019-11/10')]
#Out[63]: 
#        Date   OPP    Result
#0 2019-11-16  @DAL  L110-102
#1 2019-11-13  @POR  W114-106
#2 2019-11-11  @LAC    L98-88

答案 2 :(得分:0)

据我了解,您是否要过滤日期以删除 NaT ?那不是你怎么做的。实际上,熊猫具有几种可以检查NaT的功能,例如pandas.isnull(),pandas.notna(),pandas.DataFrame.notna()等:

下面是一个简单的示例

    >>> import pandas as pd
    >>> pd.isnull(np.datetime64('NaT'))
    True
    >>> d1[d1['New_Date'].notna()]