Python 熊猫中基于正则表达式的过滤日期索引

Python 熊猫中基于正则表达式的过滤日期索引,python,pandas,nsepy,Python,Pandas,Nsepy,我有一个日期栏,价格指数如下 日期 价格 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 将日期列转换为datetime数据类型 df['Date'] = pd.to_datetime(df['Date']) 逐月逐日过滤 df.loc[(df.Date.dt.month == 12) &am

我有一个日期栏,价格指数如下

日期 价格 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
将日期列转换为
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

将日期列转换为
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

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

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

df[df['Date'].str.endswith('12-31')]
df[df.assign(Date=df['Date'].astype(str))['Date'].str.endswith('12-31')]
案例2:“日期”列已采用日期时间格式,请使用:

df[df['Date'].str.endswith('12-31')]
df[df.assign(Date=df['Date'].astype(str))['Date'].str.endswith('12-31')]
两者都根据当前数据类型提供所需的提取输出,而无需修改数据帧

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

df['Date1'] = pd.to_datetime(df['Date'])    
df['BYearEnd'] = pd.to_datetime(df['Date1'].dt.year.astype(str) + '-12-01') + pd.offsets.BMonthEnd(1)
在这里,我们创建了临时列
Date1
BYearEnd
,其值对应于列
Date
BYearEnd
包含列
Date
中相应日期的业务年度结束日期

然后,我们可以使用以下代码提取相关日期:

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

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

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

df[df['Date'].str.endswith('12-31')]
df[df.assign(Date=df['Date'].astype(str))['Date'].str.endswith('12-31')]
案例2:“日期”列已采用日期时间格式,请使用:

df[df['Date'].str.endswith('12-31')]
df[df.assign(Date=df['Date'].astype(str))['Date'].str.endswith('12-31')]
两者都根据当前数据类型提供所需的提取输出,而无需修改数据帧

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

df['Date1'] = pd.to_datetime(df['Date'])    
df['BYearEnd'] = pd.to_datetime(df['Date1'].dt.year.astype(str) + '-12-01') + pd.offsets.BMonthEnd(1)
在这里,我们创建了临时列
Date1
BYearEnd
,其值对应于列
Date
BYearEnd
包含列
Date
中相应日期的业务年度结束日期

然后,我们可以使用以下代码提取相关日期:

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


请发布最小代码效果是日期列还是字符串列?请发布最小代码效果是日期列还是字符串列?当列已具有日期类型时,为什么必须将其转换为日期时间?你的答案在没有转换的情况下可以正常工作。OP使用的是字符串操作函数,对他来说可能是字符串列@soumithI认为OP试图使用字符串操纵,但由于类型是日期,因此无法工作。我们不能假设@soumith。类型转换只是为了安全起见。如果OP看到它已经是日期类型,他就可以编辑那一行。在我尝试之后,data.index=pd.to_datetime(data.index)data.loc[(data.index.dt.month==12)和(data.index.dt.day==31)]。。但结果显示Datetimeindex并没有属性dt。。我将索引列转换为datetime,但只将datetime作为dt导入。如何相应地更改行的代码?当列已经具有日期类型时,为什么必须将其转换为日期时间?你的答案在没有转换的情况下可以正常工作。OP使用的是字符串操作函数,对他来说可能是字符串列@soumithI认为OP试图使用字符串操纵,但由于类型是日期,因此无法工作。我们不能假设@soumith。类型转换只是为了安全起见。如果OP看到它已经是日期类型,他就可以编辑那一行。在我尝试之后,data.index=pd.to_datetime(data.index)data.loc[(data.index.dt.month==12)和(data.index.dt.day==31)]。。但结果显示Datetimeindex并没有属性dt。。我将索引列转换为datetime,但只将datetime作为dt导入。我怎样才能相应地更改行的代码?谢谢。我做到了这一点。但有些年份的最后一天是12点30分,有些年份的最后一天是12点29分。我们可以动态地获取一年中最后一天的值吗?我试过用Yearend()。它不起作用。请让我知道如何动态获取一年中的最后一天,即使它是29、30、31?。Thanks@Krish1992你是说最后一个工作日,对吗?是的,应该是从日历年的年底开始。不确定这是否是最后一个工作日。每年的日历年末总是12月31日。我猜你指的是一年中的最后一个工作日。那将是一个全新的问题。建议您查看@Krish1992查看上面的我的编辑,它提供了用于动态获取一年中最后一个工作日的值的示例代码。谢谢。我做到了这一点。但有些年份的最后一天是12点30分,有些年份的最后一天是12点29分。我们可以动态地获取一年中最后一天的值吗?我试过用Yearend()。它不起作用。请让我知道如何动态获取一年中的最后一天,即使它是29、30、31?。Thanks@Krish1992你是说最后一个工作日,对吗?是的,应该是从日历年的年底开始。不确定这是否是最后一个工作日。每年的日历年末总是12月31日。我猜你指的是一年中的最后一个工作日。那将是一个全新的问题。建议您查看@Krish1992查看上面的“我的编辑”,它提供了用于动态获取一年中最后一个工作日的值的示例代码。