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

标签 python pandas 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')

我预计是 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/

相关文章:

python - 根据其他列中的 'NaN' 值在 Pandas Dataframe 中创建一个新列

python - 如何连接 pandas.read_html 的结果列表

python - 如何将具有相同值的行分组?

python - 计算值并将值放入 M​​ultiIndex Pandas DataFrame 的二级列中

python - 从Python中的特定月份开始按年月填充日期列

python - 如何在 PyCharm 中禁用 -u 解释器选项?

python - 如何检查 selenium (python 2) 中是否存在某个元素,如果不存在则不抛出 NoSuchElement 异常?

python - 当networkx中有数百个节点时,如何避免重叠?

python - 将嵌套的 dict/json 转换为 django ORM 模型,无需对数据结构进行硬编码

python - Pandas:从索引与另一列中的值相对应的列中选择