首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonthEnd对象结果为<11 * MonthEnds>而不是number

MonthEnd对象结果为<11 * MonthEnds>而不是number
EN

Stack Overflow用户
提问于 2019-02-01 00:26:27
回答 2查看 4.2K关注 0票数 5

在我的熊猫数据框中,我想找出以月为单位的日期差异。函数.dt.to_period('M')将生成一个类似于<11 * MonthEnds>的MonthEnd对象,而不是月份数字。

我尝试使用pd.to_numeric()更改列类型,并使用re.sub("[^0-9]", "", 'blablabla123bla')删除字母。这两种方法都不适用于MonthEnd对象。

代码语言:javascript
复制
df['duration_dataset'] = df['date_1'].dt.to_period('M') - df['date_2'].dt.to_period('M')

我期望是11,但是输出是<11 * MonthEnds>

这是最小的数据帧

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-01 00:47:36

这是new behaviour in Pandas 0.24,其中减去Period()对象会得到一个DateOffset subclass

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

代码语言:javascript
复制
from operator import attrgetter

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

这就产生了

代码语言:javascript
复制
      date_1     date_2  duration_dataset
0 2018-03-31 2017-12-31                 3
1 2018-09-30 2017-12-31                 9

用于您的样本数据帧。

您可以将日期转换为0年以来的月份计数,然后减去这些数字,而不是将日期转换为期间:

代码语言:javascript
复制
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)
)

它可以简化为

代码语言:javascript
复制
df['duration_dataset'] = (
    12 * (df['date_1'].dt.year - df['date_2'].dt.year) +
    df['date_1'].dt.month - df['date_2'].dt.month
)
票数 15
EN

Stack Overflow用户

发布于 2020-04-29 12:05:40

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

代码语言:javascript
复制
df['duration_dataset'] = df['date_1'].dt.to_period('M').astype('int') - df['date_2'].dt.to_period('M').astype('int')

它看起来更快。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54465030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档