【问题标题】:counting months between two days in dataframe在数据框中计算两天之间的月份
【发布时间】:2020-06-03 11:45:21
【问题描述】:

我有一个包含多列的数据框,其中之一是日期列。我有兴趣创建一个新列,其中包含日期列和预设日期之间的月数。例如,“开始日期”列中的日期之一是“2019-06-30 00:00:00”,我希望能够计算该日期与 2021 年底之间的月数,因此 2021-12 -31 并将答案放入一个新列中,并对数据框中的整个日期列执行此操作。我无法弄清楚我该如何去做,但如果预定的结束日期是 2021-12-31,我希望它最终看起来像这样:

df =

  |start date  months
 0|2019-06-30     30
 1|2019-08-12     28
 2|2020-01-24     23

【问题讨论】:

  • 请给examples
  • 以下日期对的月数是多少:2020-01-30 和 2020-02-01、2020-01-01 和 2020-01-31、2020-01- 31 和 2020-03-01?

标签: python pandas dataframe date datetime


【解决方案1】:

您可以使用np.timedelta64

end_date = pd.to_datetime('2021-12-31')
df['start date'] = pd.to_datetime(df['start date'])
df['month'] = ((end_date - df['start date'])/np.timedelta64(1, 'M')).astype(int)
print(df)

  start date  month
0 2019-06-30     30
1 2019-08-12     28
2 2020-01-24     23

【讨论】:

    【解决方案2】:

    假设 start date 列是 datetime 类型(不是 string) 参考日期定义如下:

    refDate = pd.to_datetime('2021-12-31')
    

    或您选择的任何其他日期。

    那么你可以计算月数为:

    df['months'] = (refDate.to_period('M') - df['start date']\
        .dt.to_period('M')).apply(lambda x: x.n)
    

    【讨论】:

    • 关键差异(至少对我而言):@NYC Coder 和 Valdi_Bo 解决方案都将返回 month=1 作为 end_date = '01 Feb 2021' 和 '01 Jan 2021' 之间的差异。但是对于 end_date = '01 Feb 2021' 和 '15 Jan 2021' NYC Coder 将返回 month=0 和 Valdi_Bo 1。我需要后者,谢谢 Valdi_Bo。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2016-09-09
    • 2012-07-24
    • 2012-10-28
    • 2022-11-18
    相关资源
    最近更新 更多