[Python] `pandas.tseries.offsets` hard to predict result

Discussão em 'Python' iniciado por Stack, Setembro 12, 2025.

  1. Stack

    Stack Membro Participativo

    I found it really hard to predict the results produced by pandas.tseries.offsets, especially when n==0. Below is an example with MonthEnd and MonthBegin.

    import pandas as pd
    from pandas.tseries.offsets import MonthEnd, MonthBegin

    date_ = pd.to_datetime('20240601')
    print(date_ + MonthBegin(0)) # 2024-06-01 00:00:00
    print(date_ - MonthBegin(0)) # 2024-06-01 00:00:00
    print(date_ + MonthBegin(1)) # 2024-07-01 00:00:00, different from `+ MonthBegin(0)`
    print(date_ - MonthBegin(1)) # 2024-05-01 00:00:00
    print(date_ + MonthEnd(0)) # 2024-06-30 00:00:00
    print(date_ - MonthEnd(0)) # 2024-06-30 00:00:00
    print(date_ + MonthEnd(1)) # 2024-06-30 00:00:00, same with `+ MonthEnd(0)`
    print(date_ - MonthEnd(1)) # 2024-05-31 00:00:00
    print('\n')

    date_ = pd.to_datetime('20240615')
    print(date_ + MonthBegin(0)) # 2024-07-01 00:00:00
    print(date_ - MonthBegin(0)) # 2024-07-01 00:00:00
    print(date_ + MonthBegin(1)) # 2024-07-01 00:00:00, same with `+ MonthBegin(0)`
    print(date_ - MonthBegin(1)) # 2024-06-01 00:00:00
    print(date_ + MonthEnd(0)) # 2024-06-30 00:00:00
    print(date_ - MonthEnd(0)) # 2024-06-30 00:00:00
    print(date_ + MonthEnd(1)) # 2024-06-30 00:00:00, same with `+ MonthEnd(0)`
    print(date_ - MonthEnd(1)) # 2024-05-31 00:00:00
    print('\n')

    date_ = pd.to_datetime('20240630')
    print(date_ + MonthBegin(0)) # 2024-07-01 00:00:00
    print(date_ - MonthBegin(0)) # 2024-07-01 00:00:00
    print(date_ + MonthBegin(1)) # 2024-07-01 00:00:00, same with `+ MonthBegin(0)`
    print(date_ - MonthBegin(1)) # 2024-06-01 00:00:00
    print(date_ + MonthEnd(0)) # 2024-06-30 00:00:00
    print(date_ - MonthEnd(0)) # 2024-06-30 00:00:00
    print(date_ + MonthEnd(1)) # 2024-07-31 00:00:00, different from `+ MonthEnd(0)`
    print(date_ - MonthEnd(1)) # 2024-05-31 00:00:00


    If I have to add an if MonthBegin().is_month_end(date_) else ... before? Is there a way to simplify the logic and make the results predictable? e.g.

    for date_ in ['20240601', '20240615' ,'20240630']:
    # In a sentence, `n==0` indicates this month, `n==-1` means the previous month and `n==1` means the next month.
    date_= pd.to_datetime(date_)
    print(date_ + MonthBegin(0)) # == 2024-06-01 00:00:00
    print(date_ - MonthBegin(0)) # == 2024-06-01 00:00:00
    print(date_ + MonthBegin(1)) # == 2024-07-01 00:00:00
    print(date_ - MonthBegin(1)) # == 2024-05-01 00:00:00
    print(date_ + MonthEnd(0)) # == 2024-06-30 00:00:00
    print(date_ - MonthEnd(0)) # == 2024-06-30 00:00:00
    print(date_ + MonthEnd(1)) # == 2024-07-31 00:00:00
    print(date_ - MonthEnd(1)) # == 2024-05-31 00:00:00

    Continue reading...

Compartilhe esta Página