Pandas -两个日期之间的月数

j2datikz  于 2023-11-15  发布在  其他
关注(0)|答案(6)|浏览(118)

我认为这应该很简单,但我所看到的是涉及迭代一个嵌套的日期字段来确定两个日期之间的差异的技术。我遇到了麻烦。我熟悉MSSQL DATEDIFF,所以我认为Pandas datetime会有类似的东西。我可能有,但我错过了它。
有没有一种Pandonic方法可以将月数确定为两个日期(日期时间)之间的整数,而不需要重新计算?请记住,可能有数百万行,因此性能是一个考虑因素。
dates是datetime对象,结果应该是- new列是Month:

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

字符串

mitkmikd

mitkmikd1#

这里有一个简单的答案,我的朋友:

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

字符串
现在:

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

ffdz8vbo

ffdz8vbo2#

另一种可能更优雅的解决方案是delta = df.Date2.dt.to_period('M') - df.Date1.dt.to_period('M'),它可以避免舍入错误。
从Pandas 0.24开始,这个表达式返回一个偏移量,可以用delta.apply(lambda x: x.n)转换为整数

q9rjltbz

q9rjltbz3#

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

字符串

siotufzp

siotufzp4#

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

字符串

wmomyfyw

wmomyfyw5#

只是对@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

字符串

3phpmpom

3phpmpom6#

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

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月还有两个月。在大多数情况下,两者都会给出相同的答案,但是考虑到上下文,其中一个可能比另一个更正确。

相关问题