2016-08-18 3 views
2

У меня есть список временных меток в таком формате: '2016-08-01 13:02:57' или "% Y-% m-% d-% H -% M-% S-% f "Получите первое и последнее время для каждого дня с датой дня Python

Я хотел бы получить первый и последний раз за каждый день. Итак, если бы было два дня 8/1 и 7/29, функция вернула бы 4 значения. Например:

8/1 
first: '2016-08-01 13:02:57' 
last: '2016-08-01 13:08:44' 

7/29 
first: '2016-07-29 14:34:02' 
last: '2016-07-29 14:37:35' 

В первый раз это тот, который происходит первый в тот день, в последний раз это тот, который происходит в последний раз в тот день.

+0

Что такое * последний раз *? –

+0

Спасибо, я изменил свой вопрос, чтобы быть более ясным. – sparrow

+0

Есть ли данные о часовом поясе? Все ли они в одном часовом поясе? –

ответ

1

Группа по год-месяц-день, то получите мин и макс:

from collections import defaultdict 
d = defaultdict(list) 
dates = ['2016-08-01 13:02:54',............] 
for dte in dates: 
    key, _ = dte.split() 
    d[key].append(dte) 

for k,v in d.items(): 
    print(min(v), max(v)) 

Из-за форматов даты, вам не нужно преобразовать в DateTimes, лексикографическое сравнение будет работать нормально. Вы можете сделать функцию, которая делает min и max в одном цикле, но может быть не так быстро, как встроенные.

+0

Спасибо, что сработало. Я использовал key = dte.month, чтобы использовать формат datetime. – sparrow

+1

@sparrow, не стоит беспокоиться, я не понимал, что они были фактическими датами, было бы безопасно сравнивать так же, как и строку, но если они уже давно, то уверен, но годы и дни могут быть разными, хотя нет? Вы бы хотели '(dte.year, dte.month, dte.day)' no? –

+0

Это хороший момент. Я думаю, что строки лучше, потому что мне будет дешевле конвертировать данные вверх по течению. – sparrow

-1

Чтобы разумно группировать ваши данные, я бы, вероятно, использовал словарь следующим образом, сначала разделив вашу строку на половину и половину времени.

d = dict() 
for item in L: 
    if item in d: 
     d[item] = [time] 
    else: 
     d[item].append(time) 

Тогда у вас есть указание на отображение определенных дат на список раз. Тогда, вероятно, тривиально использовать некоторую функцию datetime, которая может делать max (list) и min (list), чтобы дать вам самое раннее и последнее время.

1

Лексическое сравнение с вашим форматом datetime дает минимальные и максимальные даты. Поэтому вам просто нужно сгруппировать все даты с одной и той же датой в каждом списке:

from collections import defaultdict 
dates = ['2016-08-01 13:02:57', '2016-08-01 13:08:44', ...] 
dates_and_times = defaultdict(list) 
for date in dates: 
    d, t = date.split() 
    dates_and_times[d].append(t) 

for date, times in dates_and_times.items(): 
    print(date, min(times)) 
    print(date, max(times))