Создать идентификатор группы для отметок времени

1

Ниже приведены данные, которые я имею

  timediff
2018-06-19 01:00:00
2018-06-19 01:00:01
2018-06-19 01:00:02
2018-06-19 01:00:03
2018-06-19 02:00:00
2018-06-19 02:00:01
2018-06-19 02:00:02
2018-06-19 02:00:03
2018-06-19 02:15:00
2018-06-19 02:15:01
2018-06-19 02:15:02
2018-06-19 02:15:03
2018-06-19 02:30:00
2018-06-19 02:30:01
2018-06-19 02:30:02
2018-06-19 02:30:03

Я хочу создать идентификатор группы для каждой группы времени в данных. если данные находятся в пределах 4-5 секунд, я хочу создать идентификатор для каждой группы.

выход должен быть похож,

timediff                identifier
2018-06-19 01:00:00          1
2018-06-19 01:00:01          1
2018-06-19 01:00:02          1
2018-06-19 01:00:03          1
2018-06-19 02:00:00          2
2018-06-19 02:00:01          2
2018-06-19 02:00:02          2
2018-06-19 02:00:03          2
2018-06-19 02:15:00          3
2018-06-19 02:15:01          3
2018-06-19 02:15:02          3
2018-06-19 02:15:03          3
2018-06-19 02:30:00          4
2018-06-19 02:30:01          4
2018-06-19 02:30:02          4
2018-06-19 02:30:03          4

Поскольку каждая запись в течение интервала времени составляет 4-5 секунд, я хочу сохранить ее в одной группе. Аналогичным образом, я хочу идентифицировать все группы.

Я новичок в python и не знаю, как это сделать.

Может ли кто-нибудь помочь мне в этом?

Теги:
python-2.7

2 ответа

1
Лучший ответ

Я использовал групповые штампы с пятиминутными интервалами. если время в одной группе будет сгенерировано с той же group_key:

group_key = int (временные метки/интервал) * интервал

group_key означает, что время находится в межрегиональном [group_key, group_key + interval)

например:

interval is 5 seconds
group_key | timestame| time
1529341200 1529341200 '2018-06-19 01:00:00'
1529341200 1529341201 '2018-06-19 01:00:01'
1529341200 1529341202 '2018-06-19 01:00:02'
1529341200 1529341203 '2018-06-19 01:00:03'
1529341200 1529341204 '2018-06-19 01:00:04'

1529341205 1529341205 '2018-06-19 01:00:05'
1529341205 1529341206 '2018-06-19 01:00:06'
1529341205 1529341207 '2018-06-19 01:00:07'
1529341205 1529341208 '2018-06-19 01:00:08'
1529341205 1529341209 '2018-06-19 01:00:09'

1529341210 1529341210 '2018-06-19 01:00:10'
1529341210 1529341211 '2018-06-19 01:00:11'
1529341210 1529341212 '2018-06-19 01:00:12'
1529341210 1529341213 '2018-06-19 01:00:13'
1529341210 1529341214 '2018-06-19 01:00:14'

для вашего вопроса:

import time
datetimes=['2018-06-19 01:00:00','2018-06-19 01:00:01','2018-06-19 01:00:02','2018-06-19 01:00:03','2018-06-19 02:00:00','2018-06-19 02:00:01','2018-06-19 02:00:02','2018-06-19 02:00:03','2018-06-19 02:15:00','2018-06-19 02:15:01','2018-06-19 02:15:02','2018-06-19 02:15:03','2018-06-19 02:30:00','2018-06-19 02:30:01','2018-06-19 02:30:02','2018-06-19 02:30:03']

time_interval = 5
group = {}

print "timediff               identifier"
for dt in datetimes:
    timestamp = int(time.mktime(time.strptime(dt, '%Y-%m-%d %H:%M:%S')))
    identifier = int(timestamp/time_interval)*time_interval
    print "'"+dt+"'", identifier

но идентификатор не 1,2,3,4, это стартовая временная метка группы, я думаю, что она более значима. если вы должны использовать 1,2,3,4, вам нужно сделать дальнейшую трансформацию.

выход:

timediff               identifier
'2018-06-19 01:00:00' 1529341200
'2018-06-19 01:00:01' 1529341200
'2018-06-19 01:00:02' 1529341200
'2018-06-19 01:00:03' 1529341200
'2018-06-19 02:00:00' 1529344800
'2018-06-19 02:00:01' 1529344800
'2018-06-19 02:00:02' 1529344800
'2018-06-19 02:00:03' 1529344800
'2018-06-19 02:15:00' 1529345700
'2018-06-19 02:15:01' 1529345700
'2018-06-19 02:15:02' 1529345700
'2018-06-19 02:15:03' 1529345700
'2018-06-19 02:30:00' 1529346600
'2018-06-19 02:30:01' 1529346600
'2018-06-19 02:30:02' 1529346600
'2018-06-19 02:30:03' 1529346600
0

Помощь, которую вы ищете, - это модуль datetime Python, в частности класс datetime.timedelta.

Дайте два экземпляра datetime в Python, вы можете получить их различие просто, вычитая их, и эта разница предоставляется вам в форме экземпляра datetime.timedelta:

import datetime

# Parse a couple datetimes...
t1 = datetime.strptime('2018-06-19 14:23:14', '%Y-%m-%d %H:%M:%S')
t2 = datetime.strptime('2018-06-19 14:23:16', '%Y-%m-%d %H:%M:%S')

diff = t2 - t1 # Get the timedelta

if diff.seconds < 4:
    # t1 and t2 are in the same "group"

Свойство .seconds timedelta дает вам количество секунд (округленное до ближайшей целой секунды, то есть) между двумя датами.

Учитывая эти знания, вы можете перебирать список строк времени и группировать их так (ПРИНИМАЯ ВРЕМЕННЫЕ ПАРАМЕТРЫ УЖЕ ПОСРЕДСТВОМ/ПОСЛЕДОВАТЕЛЬНОСТЬЮ):

import datetime

datetimes = ['2018-06-19 14:23:14', '2018-06-19 14:23:16', '2018-06-19 14:23:27', '2018-06-19 14:23:28', '2018-06-19 14:23:29']

# For collecting the groups
grouped_datetimes = []

# Assumes the datetimes are already in order; if not, you can sort them beforehand
min_ts = datetime.datetime.strptime(datetimes[0], '%Y-%m-%d %H:%M:%S')
group = [datetimes[0]]
for dt in datetimes[1:]:
    ts = datetime.datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
    diff = ts - min_ts
    if diff.seconds < 4:
        group.append(dt)
    else:
        grouped_datetimes.append(group)
        group = [dt]
        min_ts = ts

# Add the last group that was built up
if group:
    grouped_datetimes.append(group)


for index, group in enumerate(grouped_datetimes):
    for ts in group:
        print(f'{ts}\t{index}')

Это будет выводить:

2018-06-19 14:23:14 0
2018-06-19 14:23:16 0
2018-06-19 14:23:27 1
2018-06-19 14:23:28 1
2018-06-19 14:23:29 1

Это просто быстрое и грязное решение; в зависимости от вашего конкретного варианта использования, вы можете определенно улучшить его. Надеюсь, вы поймете, как использовать timedeltas для его решения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню