0

日時の配列を考えてみましょう:

2010-07-17 16:09:00 -0700
2010-07-17 16:10:00 -0700
2010-07-17 16:12:00 -0700
2010-07-17 17:44:00 -0700
2010-07-18 02:12:00 -0700

出力が次のようになるように、配列を反復処理して不足している分を挿入するためのクリーンで慣用的な方法は何ですか?

2010-07-17 16:09:00 -0700
2010-07-17 16:10:00 -0700
2012-07-17 16:11:00 -0700
2010-07-17 16:12:00 -0700
2010-07-17 16:13:00 -0700
...

ルビー1.9.3

編集:詳細:

実際には、日付時刻をキーとするハッシュの配列です。

2010-07-17 16:09:00 -0700 => 5
2010-07-17 16:10:00 -0700 => 22
2010-07-17 16:12:00 -0700 => 3

したがって、欠落している各分には、前の既存の分の値が含まれている必要があります。

また、Rails を使用していません。

4

1 に答える 1

1
require 'date'

# dummy dates
dates = "2010-07-17 16:09:00 -0700
2010-07-17 16:10:00 -0700
2010-07-17 16:12:00 -0700
2010-07-17 17:44:00 -0700
2010-07-18 02:12:00 -0700"

datetimes = dates.lines.map{|s| DateTime.parse(s) }

continuous_datetimes = [datetimes.min]

while continuous_datetimes.last < datetimes.max
  continuous_datetimes.push( continuous_datetimes.last + 1.0/24.0/60.0 )
end

continuous_datetimes.first(10).each{|d| puts d}
# 2010-07-17T16:09:00-07:00
# 2010-07-17T16:10:00-07:00
# 2010-07-17T16:11:00-07:00
# 2010-07-17T16:12:00-07:00
# 2010-07-17T16:13:00-07:00
# 2010-07-17T16:14:00-07:00
# 2010-07-17T16:15:00-07:00
# 2010-07-17T16:16:00-07:00
# 2010-07-17T16:17:00-07:00
# 2010-07-17T16:18:00-07:00

編集

次のコードは、ハッシュ構造を反映しています。

設定:

require 'date'

# dummy dates
hash = {
  DateTime.parse("2010-07-17 16:09:00 -0700") => 5,
  DateTime.parse("2010-07-17 16:10:00 -0700") => 22,
  DateTime.parse("2010-07-17 16:12:00 -0700") => 3
}

実際のコード:

new_hash = hash.inject(Hash[ *hash.first ]) do |tmp,kv|
  while tmp.keys.last < kv.first
    tmp[ tmp.keys.last + 1.0/24.0/60.0 ] = kv.last
  end
  tmp
end

出力:

new_hash.each {|k,v| puts "#{k} => #{v}" }
# 2010-07-17T16:09:00-07:00 => 5
# 2010-07-17T16:10:00-07:00 => 22
# 2010-07-17T16:11:00-07:00 => 3
# 2010-07-17T16:12:00-07:00 => 3
于 2012-11-05T16:08:39.973 に答える