code: def games_by_time(self, start_game, end_game):
          
          move_count = b'move_count'
          rows = self.bt_table.read_rows(
              ROWCOUNT_PREFIX.format(start_game),
              ROWCOUNT_PREFIX.format(end_game),
              filter_=bigtable_row_filters.ColumnRangeFilter(
                  METADATA, move_count, move_count))
  
          def parse(r):
              rk = str(r.row_key, 'utf-8')
              game = _game_from_counter.match(rk).groups()[0]
              return (r.cells[METADATA][move_count][0].timestamp, game)
          return sorted([parse(r) for r in rows], key=operator.itemgetter(0))
docs: Given a range of games, return the games sorted by time.
  
          Returns [(time, game_number), ...]
  
          The time will be a `datetime.datetime` and the game
          number is the integer used as the basis of the row ID.
  
          Note that when a cluster of self-play nodes are writing
          concurrently, the game numbers may be out of order.