提问人:Silverdust 提问时间:11/6/2023 最后编辑:Silverdust 更新时间:11/6/2023 访问量:110
润滑剂 (R) 如何计算两个日期之间的月数?
How does lubridate (R) compute the number of months between two dates?
问:
我正在尝试将一些特征工程例程从 R 翻译成 Python,并在 R 代码库中偶然发现了以下代码行:
interval(ymd(VERSTARTDATUM),ymd(SERMELDEDATUM)) %/% months(1)
经过一番阅读,我发现 R 似乎认为一个月平均由 30.4375 天组成,并且 R 使用该常数来计算两个随机日期之间的月数。简而言之,R 计算两个日期相隔多少天 30.4375 天。所以我想出了这个 Python (Pandas) 代码作为翻译:
(df['VERSTARTDATUM'] - df['SERMELDEDATUM']).abs().dt.days.div(30.4375).round().astype(int)
生成的数据在所有逆境的 97.95034% 中匹配(5047 个中的 4970 个)。 在调查了为什么它并不总是匹配时,我发现 R 的行为方式我似乎无法理解!代码如下:
print(interval(ymd('2017-02-03'),ymd('2018-03-05')) %/% months(1))
print('--------')
print(interval(ymd('2017-02-03'),ymd('2018-03-05')) %>% as.numeric)
print(months(1) %>% as.numeric)
print('--------')
print(34128000 %/% 2629800)
print('--------')
print(34128000 / (days() %>% as.numeric * 30.4375))
输出如下:
[1] 13
[1] "--------"
[1] 34128000
[1] 2629800
[1] "--------"
[1] 12
[1] "--------"
[1] 12.97741
因此,R 似乎将 12.97741 个月(一个月由 30.4375 天组成)四舍五入到 13 个月,我想这可以被认为是合理的。
但现在,以下几乎相同的代码(唯一的区别是两个日期被交换为不同的日期):
print(interval(ymd('2015-06-19'),ymd('2017-07-18')) %/% months(1))
print('--------')
print(interval(ymd('2015-06-19'),ymd('2017-07-18')) %>% as.numeric)
print(months(1) %>% as.numeric)
print('--------')
print(65664000 %/% 2629800)
print('--------')
print(65664000 / (days() %>% as.numeric * 30.4375))
打印以下内容:
[1] 24
[1] "--------"
[1] 65664000
[1] 2629800
[1] "--------"
[1] 24
[1] "--------"
[1] 24.9692
现在,R 将 24.9692 个月(一个月又由 30.4375 天组成)四舍五入到 24 个月(当然,我的 Python 等价物没有 - 因此在 5074 个观测点中的 104 个之间存在差异)。
我的问题很简单:R 如何计算两天之间的月数。显然不是我所希望的那样。
答: 暂无答案
评论