Задача довольно проста, и я могу ее частично выполнить:

from dateutil.parser import parse

    for timestamp, grp in itertools.groupby(transactions, lambda x: parse(x['date']).hour):
        group = list(grp)
        logger.info(f'{timestamp} : {len(group)}')

-> я получаю массив hour:count.

Однако я хочу иметь массив datetime:count в результате (где datetime объект представляет один час).

Нужно ли мне строить объект datetime в функции lambda x? (то есть получить x['date']).hour, x['date']).day, x['date']).month и т. д. и создать новое datetime с использованием этих значений) или есть другой способ?

пример ввода (транзакции) содержит данные за недели / месяцы:

[
 {
  'date': '2018-12-04T15:34:40+00:00',
  'data': 'blabla'
 },
 {
  'date': '2018-12-04T15:38:40+00:00',
  'data': 'blabla'
 },
 {
  'date': '2018-12-04T15:45:40+00:00',
  'data': 'blabla'
 },
]

пример вывода:

2018-12-04 13:00:00+00:00 : 6
2018-12-04 14:00:00+00:00 : 1
2018-12-04 15:00:00+00:00 : 2

Спасибо

-1
user1935987 6 Дек 2018 в 22:02

2 ответа

Лучший ответ

Вам нужно использовать объект datetime в качестве ключа, я использовал сейчас как дату, но вы можете использовать исходную дату:

import itertools
import datetime
from dateutil.parser import parse

transactions = ['2018-12-04 13:{}0:00+00:00'.format(i) for i in range(6)] + \
               ['2018-12-04 14:{}0:00+00:00'.format(i) for i in range(1)] + \
               ['2018-12-04 15:{}0:00+00:00'.format(i) for i in range(2)]
for timestamp, grp in itertools.groupby(transactions, key=lambda x: datetime.datetime.combine(parse(x).date(), datetime.time(parse(x).hour, 0, 0, 0))):
    count = list(grp)
    print('{}:{}'.format(timestamp, len(count)))

Вывод

2018-12-04 13:00:00:6
2018-12-04 14:00:00:1
2018-12-04 15:00:00:2
1
Dani Mesejo 6 Дек 2018 в 20:39

Так как я collections.Counter фанат:

from dateutils.parser import parse
from collections import Counter

counter = Counter()
for transaction in transactions:
    counter.update(str(parse(transaction['date'][:-12])),)
for key,value in sorted(counter.items()):
    print(f'{key}: {value}')

И вот решение, использующее понимание списка:

from dateutils.parser import parse
from collections import Counter

counter = Counter([str(parse(x['date'][:-12])) for x in transactions]) 

for key,value in sorted(counter.items()):
    print(f'{key}: {value}')
0
accdias 6 Дек 2018 в 20:19