def addMissingMonths (datesHash)
count = 0
result = {}
datesHash.keys.each do |x|
if x != datesHash.keys.last
(x+1.month).upto(datesHash.keys[count+1]-1.month) do |a|
result[a.at_beginning_of_month] = 0
end
end
count += 1
end
return result.merge!(datesHash)
end
8条答案
按热度按时间agyaoht71#
例如:
qpgpyjmq2#
Ruby
Date
支持生成连续的日期,并提供了可用于高效迭代数月的next_month
方法。下面是一个适应输入精度的泛型方法:
yfjy0ee73#
我想出了这个解决方案来生成范围内所有[年,月]元组的列表:
yc0p9oo04#
=> [Fri, 01 Sep 2017, Sun, 01 Oct 2017, Wed, 01 Nov 2017, Fri, 01 Dec 2017, Sun, 01 Jan 2017, Thu, 01 Feb 2018, Thu, 01 Mar 2018, Sun, 01 Apr 2018, Tue, 01 May 2018, Fri, 01 Jun 2018, Sun, 01 Jul 2018, Wed, 01 Aug 2018]
ebdffaop5#
或者获取您的月/年数组:
使用Up to方法从Date:http://ruby-doc.org/stdlib-2.0/libdoc/date/rdoc/Date.html#method-i-upto开始
koaltpgm6#
这是我写的一种解决这个问题的方法。这是为处理散列数据而设计的,例如:{Sun,01 Jan 2012=>58,Wed,01 Feb 2012=>0,Tsinghua,01 Mar 2012=>0},但可以轻松地针对数组数据进行修改。
请参见:https://github.com/StephenOTT/add_missing_dates_ruby,其中我提供了一个工作代码示例
但代码的关键部分是:
需要查看的关键内容是:
(x+1.month).upto(datesHash.keys[count+1]-1.month)
vltsax257#
这里的大多数答案都需要在范围内每天迭代。这意味着,如果您在几年的时间内执行此操作,您可能会有一个包含数千次迭代的循环。
此代码段创建一个循环,其步数与范围内的月份数相同,这样效率更高:
这种方法的一个奇怪之处是,它只适用于在每月的第一天的日期。因此,如果您有像
Date.new(2020, 10, 12)
这样的日期,则需要将其转换为每月的第一天nukf8bse8#
我有一个略微不同的问题,但它是相关的:我需要在给定的开始和结束年之间的几个月。