我有一个熊猫DataFrame与“日期”列。现在我需要过滤掉DataFrame中日期在未来两个月之外的所有行。实际上,我只需要保留接下来两个月内的行。

实现这一目标的最佳方式是什么?


当前回答

按日期过滤数据帧的最短方法: 假设你的日期列的类型是datetime64[ns]

# filter by single day
df_filtered = df[df['date'].dt.strftime('%Y-%m-%d') == '2014-01-01']

# filter by single month
df_filtered = df[df['date'].dt.strftime('%Y-%m') == '2014-01']

# filter by single year
df_filtered = df[df['date'].dt.strftime('%Y') == '2014']

其他回答

你可以用pd。时间戳来执行查询和本地引用

import pandas as pd
import numpy as np

df = pd.DataFrame()
ts = pd.Timestamp

df['date'] = np.array(np.arange(10) + datetime.now().timestamp(), dtype='M8[s]')

print(df)
print(df.query('date > @ts("20190515T071320")')

输出

                 date
0 2019-05-15 07:13:16
1 2019-05-15 07:13:17
2 2019-05-15 07:13:18
3 2019-05-15 07:13:19
4 2019-05-15 07:13:20
5 2019-05-15 07:13:21
6 2019-05-15 07:13:22
7 2019-05-15 07:13:23
8 2019-05-15 07:13:24
9 2019-05-15 07:13:25


                 date
5 2019-05-15 07:13:21
6 2019-05-15 07:13:22
7 2019-05-15 07:13:23
8 2019-05-15 07:13:24
9 2019-05-15 07:13:25

看看DataFrame的pandas文档。查询,特别是提到局部变量引用udsing @前缀。在这种情况下,我们引用pd。使用本地别名ts来提供时间戳字符串

如果你想使用.query()方法,这是另一种解决方案。

它允许你使用编写可读的代码,如.query(f"{start} < MyDate < {end}")的权衡,.query()解析字符串,列值必须是熊猫日期格式(这样。query()也可以理解)

df = pd.DataFrame({
     'MyValue': [1,2,3],
     'MyDate': pd.to_datetime(['2021-01-01','2021-01-02','2021-01-03'])
})
start = datetime.date(2021,1,1).strftime('%Y%m%d')
end = datetime.date(2021,1,3).strftime('%Y%m%d')
df.query(f"{start} < MyDate < {end}")

(下面是@Phillip Cloud的评论,@Retozi的回答)

用pyjanitor怎么样

它有很酷的功能。

pip后安装pyjanitor

import janitor

df_filtered = df.filter_date(your_date_column_name, start_date, end_date)

导入熊猫文库

进口熊猫作为pd

步骤1:使用pd.to_datetime()方法将日期列转换为字符串

   df['date']=pd.to_datetime(df["date"],unit='s')

第二步:以任何预定的方式进行筛选(即2个月)

  df = df[(df["date"] >"2022-03-01" & df["date"] < "2022-05-03")]

步骤3:检查输出

 print(df)

如果您已经使用pd将字符串转换为日期格式。To_datetime你可以使用:

df = df [(df[日期]>”2018-01-01”)及(df[日期]<”2019-07-01”)