【问题标题】:How to subtract month correctly in Pandas如何在 Pandas 中正确减去月份
【发布时间】:2017-07-20 09:06:28
【问题描述】:

我的数据框有两列。当我减去它们以获得中间的月份时,我得到了一些奇怪的数字。这是一个例子:

test = pd.DataFrame({'reg_date': [datetime(2017,3,1), datetime(2016,9,1)], 
                 'leave_date':[datetime(2017,7,1), datetime(2017,6,1)]})
test['diff_month'] = test.leave_date.dt.month - test.reg_date.dt.month
test

输出:

如果用户的 register_date 是去年,我得到一个负数(也是不正确的)。

我应该执行哪些操作来获得两个日期时间列之间的正确月份时差?


更新:我稍微更改了示例,以便更多地反映我所面临的问题。不要这么快就投反对票。

我为解决此问题所做的一个技巧是:

test['real_diff'] = test.diff_month.apply(lambda x: x if x > 0 else 12+x)

我不喜欢黑客,所以我很好奇是否有其他方法。

【问题讨论】:

标签: python pandas


【解决方案1】:

IIUC 您可以致电apply 并按照@zipa 的建议使用relativedelta

In[29]:
from dateutil import relativedelta
test['real_diff'] = test.apply(lambda row: relativedelta.relativedelta(row['leave_date'], row['reg_date']).months, axis=1)
test

Out[29]: 
  leave_date   reg_date  real_diff
0 2017-07-01 2017-03-01          4
1 2017-06-01 2016-09-01          9

【讨论】:

  • 请注意,如果相差 12 个月或更长时间,这将无法按预期工作。为此,您还需要使用 relativedelta.relativedelta.years 属性。
【解决方案2】:

要获得结果,您可以使用来自dateutilrelativedelta

import datetime
from dateutil import relativedelta

a = datetime.datetime(2016, 12, 1)
b = datetime.datetime(2017, 5, 1)

relativedelta.relativedelta(b, a).months
#5

【讨论】:

  • 谢谢zipa,我给出的例子不是很准确。我已经更新了我的问题。
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2021-08-25
  • 2016-11-08
相关资源
最近更新 更多