Ниже приведены данные, которые я имею
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 и не знаю, как это сделать.
Может ли кто-нибудь помочь мне в этом?
Я использовал групповые штампы с пятиминутными интервалами. если время в одной группе будет сгенерировано с той же 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
Помощь, которую вы ищете, - это модуль 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 для его решения.