熊猫时间几个月



如何使用熊猫计算经过的月份?我已经写了以下内容,但是此代码并不优雅。你能告诉我更好的方法吗?

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

pandas 0.24.0 的更新:

由于0.24.0已将API更改为返回月末从周期减法中,您可以按以下方式进行一些手动计算以获取整个月的差异:

12 * (df.today.dt.year - df.date.dt.year) + (df.today.dt.month - df.date.dt.month)
# 0    2
# 1    1
# dtype: int64

包裹在功能中:

def month_diff(a, b):
    return 12 * (a.dt.year - b.dt.year) + (a.dt.month - b.dt.month)
month_diff(df.today, df.date)
# 0    2
# 1    1
# dtype: int64

在熊猫0.24.0之前。您可以使用to_period()将日期圆成日期,然后减去结果:

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

您也可以尝试:

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

pandas 1.3

更新

如果您想要整数而不是MonthEnd对象:

df['elapsed_months'] = df.today.dt.to_period('M').view(dtype='int64') - df.date.dt.to_period('M').view(dtype='int64')
df
# Out[11]: 
#         date      today  elapsed_months
# 0 2016-10-11 2016-12-02               2
# 1 2016-11-01 2016-12-02               1

这与熊猫1.1.1:

一起使用
df['elapsed_months'] = df.today.dt.to_period('M').astype(int) - df.date.dt.to_period('M').astype(int)
df
# Out[11]: 
#         date      today  elapsed_months
# 0 2016-10-11 2016-12-02               2
# 1 2016-11-01 2016-12-02               1

以更简单的方式,也可以使用pandas中的to_period函数来计算。

pd.to_datetime('today').to_period('M') - pd.to_datetime('2020-01-01').to_period('M')
# [Out]:
# <7 * MonthEnds>

,如果您只需要使用(<above_code>).n

使用可以使用 .n作为整数以获取数月的数量:

(pd.to_datetime('today').to_period('M') - pd.to_datetime('2020-01-01').to_period('M')).n

在数据框架上,您可以将其与.apply

一起使用
df["n_months"] = (df["date1"].dt.to_period("M") - df["date2"].dt.to_period("M")).apply(lambda x: x.n)

还要照顾PANDAS 1.3.2 INT转换问题以及任何较早转换为INT的舍入问题。

以下将实现这一目标:

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

如果您不介意忽略日子,则可以使用numpy功能:

import numpy as np
df['elapsed month'] = (df.date.values.astype('datetime64[M]')-    
                    df.today.values.astype('datetime64[M]')) 
                          / np.timedelta64(1,'M')

最新更新