首页 > 解决方案 > 如何从数据框中获取每个月的最后一天并从数据框中删除其余日期?

问题描述

在此处输入图像描述

大家好,该图像是我正在学习python的数据框。

从这个数据框中,我试图找到每年 12 月最后一天的行记录。我的目标是在数据框中以黄色突出显示记录并删除白色行。

例如,对于 2010 年,我只想保留第 3 条记录并删除第 1 到第 2 行。至于 2011 年,我想删除第 4 到第 7 行并保留第 8 行。

下面是我写的代码。我打算使用循环来查找我想要保留的记录并删除其余的记录。

为了使用月份值保留记录,我设法通过保留 12 月并删除 1 月到 11 月的记录来实现我的目标

但是,对于几天(最后 3 行代码),我意识到最后一天并不总是以数据框中的 31 结束,我无法使用我的初始逻辑来删除。

如果有更好的解决方案可以在数据框中找到该月的最后一天并删除其余日期,我可以寻求帮助吗?

谢谢

amalgamate=pd.read_excel("amalgamate.xlsx")

##Create last 3 columns to segregate Year, Month and Day.
amalgamate["Date"] = pd.to_datetime(amalgamate["Date"], errors = "raise", format = "%Y-%m-%d")
amalgamate["Year"]=amalgamate["Date"].dt.year
amalgamate["Month"]=amalgamate["Date"].dt.month
amalgamate["Day"]=amalgamate["Date"].dt.day


listofMonth=amalgamate.Month.unique()
listofDay=amalgamate.Day.unique()

#Loop through the records and remove records that are not Dec for each year
for eachmonth in listofMonth:
    if eachmonth !=12:
        amalgamate=amalgamate[amalgamate.Month != eachmonth]
        
#Loop through the records and remove records that are not 31 for each month
for eachday in listofDay:
    if eachday !=31:
        amalgamate=amalgamate[amalgamate.Day != eachday]

标签: pythonpandasdataframe

解决方案


这是一个 oneliner,它将通过设置为一个月进行分组来过滤月份的最后几天Datepd.Grouper然后从每个组中获取最后一行:

df.loc[df.groupby(pd.Grouper(key='Date', freq='1M')).Date.idxmax()]

推荐阅读