【问题标题】:Filter date index based on regex in pandas根据熊猫中的正则表达式过滤日期索引
【发布时间】:2021-06-11 18:28:54
【问题描述】:

我有如下价格指数的日期列,

Date Price
2010-01-01 23
2010-12-31 25
2013-02-03 24
2013-12-31 28
2016-03-04 27
2016-12-31 28
2018-01-01 31
2020-01-01 30
2020-12-31 20

我想提取以 12-31 结尾的日期。我该怎么做?

我尝试使用data.index.loc['*-12-31],但它不起作用。

由于这是日期 str.contains 或 startswith 或 endswith 不起作用。

有什么办法吗?

谢谢

【问题讨论】:

  • 请发布最少的代码工作
  • 是日期列还是字符串列?

标签: python pandas nsepy


【解决方案1】:

将日期列转换为datetime 数据类型

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

按月和日过滤

df.loc[(df.Date.dt.month == 12) & (df.Date.dt.day == 31)]

输出

        Date  Price
1 2010-12-31     25
3 2013-12-31     28
5 2016-12-31     28
8 2020-12-31     20

【讨论】:

  • 当列已经有日期类型时,为什么必须将其转换为日期时间?您的答案无需转换即可正常工作。
  • OP 使用的是字符串操作函数,对他来说可能是字符串列。 @sumith
  • 我认为 OP 试图使用字符串操作,但它不起作用,因为类型是日期。
  • 我们不能假设@soumith。类型转换只是为了安全起见。如果 OP 发现它已经是 Date 类型,他可以省略该行。
  • 按照我的尝试,data.index = pd.to_datetime(data.index) data.loc[(data.index.dt.month==12)&(data.index.dt.day ==31)].. 但结果显示 Datetimeindex 没有属性 dt.. 我将索引列转换为 datetime,但我将 datetime 导入为 dt only 。如何相应地更改行的代码?
【解决方案2】:

如果我们的目标是在不修改DataFrame内容的情况下从DataFrame中提取相关日期,我们可以这样做:

案例1:“日期”列已经是字符串格式,使用:

df[df['Date'].str.endswith('12-31')]

案例 2:“日期”列已经是日期时间格式,使用:

df[df.assign(Date=df['Date'].astype(str))['Date'].str.endswith('12-31')]

两者都根据当前数据类型为您提供所需的提取输出,无需修改 DataFrame。

编辑

如果您想自动提取会计年度结束时的条目,您可以尝试以下代码。这是供您参考的,您可能需要进一步微调它以清理一些中间列。

df['Date1'] = pd.to_datetime(df['Date'])    
df['BYearEnd'] = pd.to_datetime(df['Date1'].dt.year.astype(str) + '-12-01') + pd.offsets.BMonthEnd(1)

在这里,我们创建了临时列 Date1BYearEnd,其值对应于列 DateBYearEnd 包含列 Date 中各个日期的营业年度结束日期。

那么我们就可以用下面的代码来提取相关的日期了:

df[df['Date1'] == df['BYearEnd']] 

【讨论】:

  • 谢谢。我做到了这一点。但有些年份最后一天是 12-30,有些是 12-29。我们可以动态获取一年中最后一天的值吗?我尝试使用 Yearend()。它不起作用。请让我知道如何动态获取一年中的最后一天,即使它是 29、30、31?谢谢
  • @Krish1992 你的意思是最后一个工作日,对吧?
  • 是的,应该是从日历年末开始。不确定是否是最后一个工作日..
  • 日历年终将始终为每年的 12 月 31 日。我猜你的意思是一年的最后一个工作日。这将是一个全新的问题。建议你看看this post
  • @Krish1992 查看我上面的编辑,它提供了用于动态获取一年中最后一个工作日的值的示例代码。
猜你喜欢
  • 2017-06-18
  • 2020-03-14
  • 2021-08-09
  • 2013-02-25
  • 2019-07-18
  • 1970-01-01
  • 2016-01-15
  • 2020-05-05
  • 2013-06-09
相关资源
最近更新 更多