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

时间:2017-03-15 23:39:54

标签: date pandas diff

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

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

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

Date1           Date2         Months
2016-04-07      2017-02-01    11
2017-02-01      2017-03-05    1

6 个答案:

答案 0 :(得分:38)

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

df['nb_months'] = ((df.date2 - df.date1)/np.timedelta64(1, 'M'))

现在:

df['nb_months'] = df['nb_months'].astype(int)

答案 1 :(得分: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

答案 2 :(得分:5)

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

答案 3 :(得分:0)

有两个时差概念,它们在某种意义上都是正确的。让我们比较一下7月31日和9月1日之间月份的差异:

import numpy as np
import pandas as pd

dtr = pd.date_range(start="2016-07-31", end="2016-09-01", freq="D")
delta1 = int((dtr[-1] - dtr[0])/np.timedelta64(1,'M'))
delta2 = (dtr[-1].to_period('M') - dtr[0].to_period('M')).n
print(delta1,delta2)

使用numpy的时间增量delta1=1,鉴于两者之间只有一个月,这是正确的;但是delta2=2,鉴于9月与7月仍相距两个月,这也是正确的。在大多数情况下,两者都会给出相同的答案,但在给定上下文的情况下,一个可能比另一个更正确。

答案 4 :(得分:0)

在@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

答案 5 :(得分:0)

这适用于熊猫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