Python MonthEnd对象导致<;11*MonthEnds>;而不是数字

Python MonthEnd对象导致<;11*MonthEnds>;而不是数字,python,pandas,dataframe,Python,Pandas,Dataframe,在我的pandas数据框中,我想找出以月为单位的日期之间的差异。函数.dt.to_period('M')生成一个类似的MonthEnd对象,而不是月份号 我尝试将带有pd.的列类型更改为_numeric(),并删除带有re.sub(“[^0-9]”、“,”blabla123bla“)的字母。两者都不适用于MonthEnd对象 df['duration_dataset'] = df['date_1'].dt.to_period('M') - df['date_2'].dt.to_period('M

在我的pandas数据框中,我想找出以月为单位的日期之间的差异。函数
.dt.to_period('M')
生成一个类似
的MonthEnd对象,而不是月份号

我尝试将带有
pd.的列类型更改为_numeric()
,并删除带有
re.sub(“[^0-9]”、“,”blabla123bla“)
的字母。两者都不适用于
MonthEnd
对象

df['duration_dataset'] = df['date_1'].dt.to_period('M') - df['date_2'].dt.to_period('M')
我希望是11,但输出是

这是一个最小数据帧

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
也就是说,减去
Period()
对象会得到一个值

您可以从
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'))
这就产生了

date\u 1 date\u 2 duration\u数据集
0 2018-03-31 2017-12-31                 3
1 2018-09-30 2017-12-31                 9
对于您的示例数据帧

您可以将日期转换为从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)
)
可以简化为

df['duration_dataset'] = (
    12 * (df['date_1'].dt.year - df['date_2'].dt.year) +
    df['date_1'].dt.month - df['date_2'].dt.month
)

您还可以使用
astype('int')
Period
强制为
int
,并直接获取差异:

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

它似乎更快。

我发现你的行为,熊猫0.24.0你似乎有,所以这些都是。你能创建一个最小的数据框来重现这个问题吗?包含代码以生成一个包含几行的框架,以显示如何创建
MonthEnd
实例,因此我们可以帮助您更正该错误并获得整数月计数。啊,我正在使用Pandas 0.23.4进行测试,现在正在升级。我有Pandas版本0.24.0。我已经浪费了大约四个小时的时间来尝试解决这个问题。非常感谢你!当你做
df['duration\u dataset']=(df['date\u 1'].dt.year*12+df['date\u 1'].dt.month-1-(df['date\u 2'].dt.year*12+df['date\u 2'].dt.month-1))时,没有必要用
进行减法,对吗?@titusAdam:在这里的直接减法中,方程两边的
-1
,是:
df['date\u 1'].dt.year*12+df['date\u 1'].dt.month-df['date\u 2'].dt.year*12-df['date\u 2'].dt.month