2016-12-02 14 views
5

Jak mogę obliczyć upływające miesiące za pomocą pand? Mam napisać następujące, ale ten kod nie jest elegancki. Czy mógłbyś powiedzieć mi lepszy sposób?Pandy Timedelta w miesiącach

import pandas as pd 

df = pd.DataFrame([pd.Timestamp('20161011'), 
        pd.Timestamp('20161101') ], columns=['date']) 
df['today'] = pd.Timestamp('20161202') 

df = df.assign(
    elapsed_months=(12 * 
        (df["today"].map(lambda x: x.year) - 
        df["date"].map(lambda x: x.year)) + 
        (df["today"].map(lambda x: x.month) - 
        df["date"].map(lambda x: x.month)))) 
# Out[34]: 
#   date  today elapsed_months 
# 0 2016-10-11 2016-12-02    2 
# 1 2016-11-01 2016-12-02    1 

Odpowiedz

7

Można zaokrąglić datę na miesiąc to_period() a następnie odjąć wynik:

df['elapased_months'] = df.today.dt.to_period('M') - df.date.dt.to_period('M') 

df 
#   date  today elapased_months 
#0 2016-10-11 2016-12-02    2 
#1 2016-11-01 2016-12-02    1 
+1

W ten sposób elapased_months dtype jest "obiektem", więc konwertuję "obiekt" na "int64" za pomocą pd.to_numeric(). Dziękuję za Twoją odpowiedź. – Keiku

1

Następujące będzie to osiągnąć:

df["elapsed_months"] = ((df["today"] - df["date"]). 
         map(lambda x: round(x.days/30))) 


# Out[34]: 
#   date  today elapsed_months 
# 0 2016-10-11 2016-12-02    2 
# 1 2016-11-01 2016-12-02    1 
+0

Przepraszamy za brak wyjaśnienia. W ten sposób miesiące między 2016-11-30 a 2016-12-02 wynoszą 0. Chcę dostać 1 w tym przypadku. Ale było pomocne. Dziękuję za Twoją odpowiedź. – Keiku

2

można też spróbować:

df['months'] = (df['today'] - df['date'])/np.timedelta64(1, 'M') 
df 
#  date  today months 
#0 2016-10-11 2016-12-02 1.708454 
#1 2016-11-01 2016-12-02 1.018501 
Powiązane problemy