首页 > 解决方案 > 在 pandas 数据框列中查找月末

问题描述

为了帮助按月对大型数据集进行分类,我尝试将条目的所有实际日期转换为月末。

我看到了与此类似的问题并使用了我找到的代码,但如果日期恰好已经是月底(这将导致计算下个月的月底),它似乎不起作用。

df['CalcEnd'] = pd.to_datetime(df['ActualDate'], format="%m/%d/%Y") + MonthEnd(1)

这导致:

    ActualDate    CalcEnd
    7/1/2019      7/31/2019
    7/2/2019      7/31/2019
    7/31/2019     8/31/2019

第三个条目应返回 2019 年 7 月 31 日。

我尝试使用 numpy 仅在日期尚未到月底时才使用 CalcEnd 以避免此问题,但由于某种原因,如果还不是月底,则 CalcEnd 会导致一系列奇怪的数字。

具体来说,我试过:

def isMonthEnd(date):
    return date + pd.offsets.MonthEnd(0) == date

df['EndCheck'] = isMonthEnd(pd.to_datetime(df['ActualDate'], format="%m/%d/%Y"))
df['CalcEnd'] = pd.to_datetime(df['ActualDate'], format="%m/%d/%Y") + MonthEnd(1)
df['End'] = np.where(df['EndCheck']==False, df['CalcEnd'], df['ActualDate'])

当 EndCheck 为 False 时,它​​不会显示 2019 年 7 月 31 日,而是显示 1564531200000000000。

但当它为 True 时,它​​正确地将 ActualDate 显示为 7/31/2019。

任何建议:

1)如何将数据框中的所有给定日期转换为月末,即使给定日期已经是月末;和

2) 为什么在尝试使用计算列时 np.where 语句不起作用

....将不胜感激!

我可以通过将数据帧写入 csv 并在创建 End 之前将新的 csv 读回数据帧来找到解决方法;它似乎解决了 np.where 语句返回 1564531200000000000 的问题。但是,我希望有一个更优雅的解决方案。

谢谢!

标签: python-3.xpandasnumpy

解决方案


如果添加一天并根据结果进行偏移,只需检查日期是否仍在同一月份

def to_end_of_month(date):
    if (date + pd.offsets.Day(1)).month == date.month:
        return date + pd.offsets.MonthEnd(1)
    else:
        return date + pd.offsets.MonthEnd(0)

df['CalcEnd'] = df['ActualDate'].apply(to_end_of_month)

结果

    ActualDate  CalcEnd
0   2019-07-01  2019-07-31
1   2019-07-02  2019-07-31
2   2019-07-31  2019-07-31

推荐阅读