gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:52:29 28 4
gpt4 key购买 nike

在我的 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com