熊猫 - 两个日期之间的月数

sha*_*var 21 diff date pandas

我认为这应该很简单,但我所看到的是涉及迭代数据帧日期字段以确定两个日期之间差异的技术.我遇到了麻烦.我熟悉MSSQL DATEDIFF所以我认为Pandas datetime会有类似的东西.我也许会这样,但我想念它.

是否有一种Pandonic方法可以将月数确定为两个日期(日期时间)之间的整数而无需迭代?请记住,可能有数百万行,因此性能是一个考虑因素.

日期是datetime对象,结果是这样的 - 新列是Month:

Date1           Date2         Months
2016-04-07      2017-02-01    11
2017-02-01      2017-03-05    1
Run Code Online (Sandbox Code Playgroud)

ℕʘʘ*_*ḆḽḘ 44

这是一个非常简单的回答我的朋友:

df['nb_months'] = ((df.date2 - df.date1)/np.timedelta64(1, 'M'))
Run Code Online (Sandbox Code Playgroud)

现在:

df['nb_months'] = df['nb_months'].astype(int)
Run Code Online (Sandbox Code Playgroud)

  • 当心:这四舍五入到,例如,2 月 1 日和 3 月 1 日之间的 0 个月——这是您真正想要的吗?根据所讨论的月份,它给出的月份数略多于或少于整数。例如,`(pd.Timestamp('2018-03-01') - pd.Timestamp('2018-02-01')) / np.timedelta64(1, 'M') == 0.91993675`。@piRSquared 的解决方案,或者 `.round()` 可能更好。 (4认同)
  • df ['month'] =((df.date2 - df.date1)/ np.timedelta64(1,'M')).astype(int)可以解决问题.快完成 多谢兄弟. (3认同)
  • 只需转换为带有astype('int')兄弟的整数 (2认同)
  • 我同意不诚实。另一个解决方案更好,因为它需要舍入。此处建议的.asType方法对于NaT行失败(如果您刚刚计算了“下一个日期”字段,而最后一行始终是NaT,则可能会得到) (2认同)
  • 假设您正在运行Python 3,则可以使用//运算符进行整数除法以获得整数df ['nb_months'] =(df.date2-df.date1)// np.timedelta64(1,'M' )` (2认同)

piR*_*red 15

df.assign(
    Months=
    (df.Date2.dt.year - df.Date1.dt.year) * 12 +
    (df.Date2.dt.month - df.Date1.dt.month)
)

       Date1      Date2  Months
0 2016-04-07 2017-02-01      10
1 2017-02-01 2017-03-05       1
Run Code Online (Sandbox Code Playgroud)

  • 或者简单地: df["Months"] = (df.Date2.dt.year - df.Date1.dt.year) * 12 + (df.Date2.dt.month - df.Date1.dt.month) (3认同)

Paw*_*erg 12

这适用于 pandas 1.1.1:

df['Months'] = df['Date2'].dt.to_period('M').astype(int) - df['Date1'].dt.to_period('M').astype(int)

df

# Out[11]: 
#        Date1      Date2  Months
# 0 2016-04-07 2017-02-01      10
# 1 2017-02-01 2017-03-05       1
Run Code Online (Sandbox Code Playgroud)


pbe*_*kes 9

另一种可能更优雅的解决方案是 df.Date2.dt.to_period('M') - df.Date1.dt.to_period('M'),它避免了舍入错误。

  • 要返回 int 系列,请使用以下代码;`from 运算符导入 attrgetter` `(df.Date2.dt.to_period('M') - df.Date1.dt.to_period('M')).to_period('M')).apply(attrgetter('n') ))` 根据[这篇文章](/sf/answers/3812578661/) (6认同)
  • 我认为这是更正确的答案,因为舍入错误肯定会引起麻烦。 (3认同)
  • 不适用于 pandas 版本 > 0.24.0。请参阅[此](/sf/ask/2864667431/)答案以获取更新的代码。 (2认同)

aks*_*aks 7

只是对 @pberkes 答案的一小部分补充。如果您希望答案为整数值而不是 pandas._libs.tslibs.offsets.MonthEnd,只需附加.n到上面的代码即可。

(pd.to_datetime('today').to_period('M') - pd.to_datetime('2020-01-01').to_period('M')).n
# [Out]:
# 7
Run Code Online (Sandbox Code Playgroud)