2016-12-02 40 views
5

Làm cách nào để tính số tháng đã qua sử dụng gấu trúc? Tôi đã viết như sau, nhưng mã này không phải là thanh lịch. Bạn có thể cho tôi biết một cách tốt hơn không?Pandas Timedelta trong tháng

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 

Trả lời

7

Bạn có thể khỏa lấp ngày đến tháng với to_period() và sau đó trừ đi kết quả:

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

Bằng cách này, elapased_months dtype là "đối tượng", vì vậy tôi chuyển đổi "đối tượng" thành "int64" bằng cách sử dụng pd.to_numeric(). Cảm ơn bạn vì câu trả lời. – Keiku

1

Sau đây sẽ thực hiện điều này:

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

Xin lỗi vì thiếu giải thích. Theo cách này, các tháng từ 2016-11-30 và 2016-12-02 là 0. Tôi muốn nhận được 1 trong trường hợp này. Nhưng nó rất hữu ích. Cảm ơn bạn vì câu trả lời. – Keiku

2

bạn cũng có thể thử:

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 
Các vấn đề liên quan