【问题标题】:Finding end of a month in a column of pandas dataframe在 pandas 数据框列中查找月末
【发布时间】:2019-08-15 08:13:37
【问题描述】:

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

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

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 时,不显示 7/31/2019,而是显示 1564531200000000000。

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

任何建议:

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

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

.... 将不胜感激!

我能够找到一种解决方法,只需将数据帧写入 csv,然后在创建 End 之前将新的 csv 读回数据帧;它似乎解决了 np.where 语句返回 1564531200000000000 的问题。但是,我希望有一个更优雅的解决方案。

谢谢!

【问题讨论】:

    标签: python-3.x pandas numpy


    【解决方案1】:

    文档中提到的这种行为:

    当 n 不为 0 时,如果给定日期不在锚点上,它会捕捉到下一个(前一个)锚点,并向前或向后移动 |n|-1 额外的步骤。 .如果给定日期在锚点上,则移动 |n|指向前方或后方。

    您不需要np.where。修复很简单。如果你继续前进,只需在添加锚点之前减去一天。如果你往回走,在减去anchor之前加一天

    你前进到MonthEnd,所以在添加锚前减去一天

    df['CalcEnd'] = df['ActualDate']  - pd.offsets.Day() + pd.offsets.MonthEnd(1)
    
    Out[370]:
      ActualDate    CalcEnd
    0 2019-07-01 2019-07-31
    1 2019-07-02 2019-07-31
    2 2019-07-31 2019-07-31
    

    【讨论】:

    • 这是最有说服力的解决方案,消除了对所有这些无关行的需求——巧妙!也感谢您解释为什么它没有像我想象的那样工作;我将重新访问这些文档。
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2021-12-20
      • 2021-09-23
      • 2017-01-31
      • 2018-11-09
      • 2017-04-04
      • 1970-01-01
      相关资源
      最近更新 更多