MonthEnd对象的结果为<11 * MonthEnds>,而不是数字

Ing*_*nge 2 python dataframe pandas

在我的熊猫数据框中,我想找出月份之间的日期差异。该函数将.dt.to_period('M')产生一个MonthEnd对象,<11 * MonthEnds>而不是月份号。

我尝试使用更改列类型,pd.to_numeric()并使用删除字母re.sub("[^0-9]", "", 'blablabla123bla')。两者都不对一个MonthEnd对象起作用。

df['duration_dataset'] = df['date_1'].dt.to_period('M') - df['date_2'].dt.to_period('M')
Run Code Online (Sandbox Code Playgroud)

我预期为11,但输出为<11 * MonthEnds>

这是最小数据帧

d = {'date_1': ['2018-03-31','2018-09-30'], 'date_2': ['2017-12-31','2017-12-31']}
df = pd.DataFrame(data=d)

df['date_1'] = pd.to_datetime(df['date_1'], format='%Y-%m-%d')
df['date_2'] = pd.to_datetime(df['date_2'], format='%Y-%m-%d')

df['duration_dataset'] = df['date_1'].dt.to_period('M') - df['date_2'].dt.to_period('M')

df
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 10

这是Pandas 0.24中的新行为,其中减去Period()对象会为您提供DateOffset子类

您可以从DateOffset.n属性获取数值:

from operator import attrgetter

df['duration_dataset'] = (
    df['date_1'].dt.to_period('M') -
    df['date_2'].dt.to_period('M')).apply(attrgetter('n'))
Run Code Online (Sandbox Code Playgroud)

这产生

from operator import attrgetter

df['duration_dataset'] = (
    df['date_1'].dt.to_period('M') -
    df['date_2'].dt.to_period('M')).apply(attrgetter('n'))
Run Code Online (Sandbox Code Playgroud)

用于您的示例数据框。

与其将日期转换为期间,不如将它们转换为自0年起的月数,然后减去这些数字:

df['duration_dataset'] = (
    df['date_1'].dt.year * 12 + df['date_1'].dt.month - 1 -
    (df['date_2'].dt.year * 12 + df['date_2'].dt.month - 1)
)
Run Code Online (Sandbox Code Playgroud)

  • 我已经浪费了大约四个小时的生命来试图弄清楚这一点。非常感谢! (2认同)

L. *_*ong 8

您还可以强制使用Period并直接取差值:intastype('int')

df['duration_dataset'] = df['date_1'].dt.to_period('M').astype('int') - df['date_2'].dt.to_period('M').astype('int')
Run Code Online (Sandbox Code Playgroud)

似乎更快了。