R语言lubridate计算日期间隔:为何结果为0而非预期的1?
问题解决:Lubridate间隔计算返回0而非1的调整方法
原代码返回0的原因:interval("2022-01-20","2022-02-01") %/% months(1) 中的%/%是向下取整的整数除法,它只统计完整的日历月间隔。你这个时间段仅12天,距离从2022-01-20到2022-02-20的完整1个月还差8天,所以会返回0。
以下是几种能得到你期望的1的调整方法:
方法1:用小数月份向上取整
通过time_length计算间隔的小数月份,再用ceiling向上取整:
library(lubridate) int <- interval("2022-01-20", "2022-02-01") ceiling(time_length(int, unit = "months"))
运行后返回1,因为该间隔约等于0.39个月,向上取整后得到1。
方法2:直接计算月份差值
通过起始和结束日期的年、月差值计算,只要跨月就计数:
start_date <- ymd("2022-01-20") end_date <- ymd("2022-02-01") (year(end_date) - year(start_date)) * 12 + (month(end_date) - month(start_date))
这里2月减去1月等于1,直接返回结果1,适合仅需判断是否跨月的场景。
方法3:判断月份是否跨越
用简单的条件判断,只要结束月份大于起始月份就返回1:
start_date <- ymd("2022-01-20") end_date <- ymd("2022-02-01") ifelse(month(end_date) > month(start_date), 1, 0)
这种方式逻辑直观,适合短周期的跨月判断。
内容的提问来源于stack exchange,提问作者MoisesT
相关产品推荐
相关产品推荐

