【问题标题】:How to filter python pandas dataframe column by date [duplicate]如何按日期过滤python pandas数据框列[重复]
【发布时间】:2020-08-28 16:22:59
【问题描述】:

我在过滤 pandas 数据框时遇到问题 - 我想过滤“日期”列中的所有日期以仅返回上个月的日期,但 python 混淆了日期和月份并返回错误的答案。你能告诉我如何解决吗谢谢

import pandas as pd
import numpy as np
import datetime as dt
df = pd.DataFrame(pd.read_csv("Dates.csv"))
tday = dt.date.today()
tdelta = dt.timedelta(days=-30)
dt = tday + tdelta
dt = np.datetime64(dt)
print(dt)
df['Date'] = pd.to_datetime(df['Date'])
df = df.loc[df['Date'] >= dt]
print(df)

Dates.csvdf 是:

DF = 
     Met By        Date
0    David   06/07/2020
1    Philip  22/06/2020
2   Richard  02/04/2020
3   Richard  09/03/2020
4   Richard  17/02/2020
5    Philip  12/02/2020
6    Philip  29/01/2020
7      Jane  20/01/2020
8      Jane  13/01/2020
9   Richard  10/01/2020
10   Philip  06/01/2020

更新:由 VALDI 解决 - read_csv 上必须包含 dayfirst = True

import pandas as pd
df = pd.read_csv("Dates.csv", parse_dates=[1], dayfirst = True)
df = df[df['Date'] > pd.Timestamp.today() - pd.Timedelta('30D')]
print(df)

【问题讨论】:

标签: python pandas dataframe date


【解决方案1】:

让我们从阅读 DataFrame 的方式开始:

df = pd.DataFrame(pd.read_csv("Dates.csv"))

注意:

  • pd.read_csv 已经返回了一个DataFrame,
  • 因此无需从第一个创建另一个 DataFrame

更简单的方法是:df = pd.read_csv("Dates.csv")

但这还不是全部。如果您有一列包含日期,则将其转换 datetime 早在您阅读 DateFrame 时输入,因此,假设 您的文件仅包含 Met ByDate 列(无索引列), 正确的阅读公式是:

df = pd.read_csv("Dates.csv", parse_dates=[1])

现在如何过滤你的 DataFrame:

第一个提示是使用 datetime 模块,因为 Pandas 有它的原生 todayTimedelta 函数。 由于 Date 列现在是正确的 (datetime) 类型,因此您不需要任何转换。 只需使用:

df[df.Date > pd.Timestamp.today() - pd.Timedelta('30D')]

如果您还有 未来 日期并想过滤掉它们,请运行:

df[df.Date > (pd.Timestamp.today() - pd.Timedelta('30D'))
    and df.Date < pd.Timestamp.today()]

【讨论】:

  • 嗨,我正在使用您的代码:df = pd.read_csv("Dates.csv", parse_dates=[1]) df = df[df['Instruction Date'] > pd.Timestamp.today () - pd.Timedelta('30D')] - 但它仍然返回“3 Richard 2020-09-03 5 Philip 2020-12-02 9 Richard 2020-10-01”作为值 - 当它不应该返回任何值时. lmk,如果有办法解决这个谢谢
  • 如果我添加这个我也会遇到同样的问题 - df['Instruction Date'] = pd.to_datetime(df['Instruction Date'], format='%Y/%m/%d' )
  • 您的数据样本只包含过去日期,所以我没有考虑未来日期。现在我更正了这个细节。
  • 嗨 Valdi - 这不是未来的日期 - 它返回“3 Richard 09/03/2020” - 数据样本中的第三行 - 它正在将日期与月份交换 -这意味着它没有返回正确的响应。你知道如何解决这个问题吗?谢谢
  • 也将 dayfirst=True 传递给 read_csv。我记得,默认值是 False,所以天/月被交换了。
【解决方案2】:

您可以在日期列上使用 pandas 的 to_timedelta 函数和 datetime 的 datetime.now 函数

看来你需要先重新格式化日期

df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')     

然后

import datetime
import pandas as pd 


df_filtered = df[df.Date > datetime.datetime.now() - pd.to_timedelta("30day")]

根据@Henry 的建议,您也可以使用pd.Timestamp.now()

df_filtered = df[df.Date > pd.Timestamp.now() - pd.to_timedelta("30day")]

【讨论】:

  • 或者直接使用pd.Timestamp.now()
  • @HenryYik,太好了,谢谢提醒,已添加到答案中
  • hi 在下面之后仍然有同样的问题 - python 仍然将日期与月份混淆
  • 您能否详细说明将日期与月份混淆是什么意思,可能是所需的当前输出
  • 说时间戳是:2020-07-29,python 将返回包括 2020-09-03 在内的日期 - 但是这应该是 3 月 9 日,而不是 9 月 3 日
猜你喜欢
  • 2018-09-29
  • 2019-11-27
  • 2022-09-23
  • 2018-06-17
  • 2021-10-16
  • 2023-01-24
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多