在我的 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')
我预计是 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
最佳答案
这是 new behaviour in Pandas 0.24 ,其中减去 Period()
对象会得到一个 DateOffset
subclass .
您可以从 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_1 date_2 duration_dataset
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
)
关于python - MonthEnd 对象结果为 <11 * MonthEnds> 而不是数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54465030/