Pandas 日期时间过滤器

Pandas datetime filter

如果日期早于 2022 年 4 月 22 日,我想获取数据框的子集。原来的df如下

df:

    date       hour    value
0  2022-04-21  0       10   
1  2022-04-21  1       12   
2  2022-04-21  2       14 
3  2022-04-23  0       10   
4  2022-04-23  1       12   
5  2022-04-23  2       14   

我通过 df.dtypes 检查了数据类型,它告诉我 'date' 列是 'object'.

所以我使用 df['date'][0] 检查了单个单元格,它是 datetime.date(2022, 4, 21).

此外,df['date'][0] < datetime.date(2022, 4, 22) 给了我 'True'

但是,当我想通过

应用比整个数据帧更小的数据时

df2 = df[df['date'] < datetime.date(2022, 4, 22)],

它显示 TypeError: '<' not supported between instances of 'str' and 'datetime.date'

为什么会这样?提前致谢!

您的某一行中很可能仍有一些字符串日期,因此第一个元素可能没问题,但使用“<”对所有值进行完整比较将失败。

要么在评论中使用timegeb的答案。

df['date'] = pd.to_datetime(df['date'])

或者按元素转换它们

import datetime
df['date']=[datetime.datetime.strptime(d,'%Y-%m-%d') if type(d)==str else d for d in test]

如果您的任何行中有奇数字符串,这两种方法都可能失败。在这种情况下,您可以使用:

def convstr2date(d):
    if type(d)==str:
        try:    
            d = datetime.datetime.strptime(str(d),'%Y-%m-%d')
        except:
            d = np.datetime64('NaT')
    return d

df['date'] = [convstr2date(d) for d in df['date']]