Я пытаюсь заполнить недостающие слоты в CSV-файле, который имеет дату и время в виде строки.
Мой ввод:
time_slot User Location
2017-10-26 00:00:00 1 156
2017-10-26 10:00:00 1 55
2017-10-26 12:00:00 1 848
2017-10-27 02:00:00 1 79
2017-10-27 16:00:00 1 846
2017-10-27 23:00:00 1 648
2017-10-26 00:00:00 2 75
2017-10-26 02:00:00 2 32
2017-10-26 10:00:00 2 18
2017-10-27 01:00:00 2 874
2017-10-27 04:00:00 2 46
2017-10-27 18:00:00 2 96
2017-10-26 07:00:00 3 25
2017-10-26 09:00:00 3 463
2017-10-26 14:00:00 3 85
2017-10-27 06:00:00 3 95
2017-10-27 23:00:00 3 12
Вывод должен быть
time_slot User Location
2017-10-26 00:00:00 1 156
.
.
.
.
2017-10-26 09:00:00 1 156
2017-10-26 10:00:00 1 55
2017-10-26 11:00:00 1 55
2017-10-26 12:00:00 1 848
.
. 848 for all slots in between
.
2017-10-26 24:00:00 1 848
.
. 848
2017-10-27 02:00:00 1 79
.
. 79
.
2017-10-27 16:00:00 1 846
846
Same as above
2017-10-27 23:00:00 1 648
2017-10-26 00:00:00 2 75
2017-10-26 02:00:00 2 32
2017-10-26 10:00:00 2 18
2017-10-27 01:00:00 2 874
2017-10-27 04:00:00 2 46
2017-10-27 18:00:00 2 96
2017-10-26 07:00:00 3 25
2017-10-26 09:00:00 3 463
2017-10-26 14:00:00 3 85
2017-10-27 06:00:00 3 95
2017-10-27 23:00:00 3 12
частота даты и времени составляет 1 час. Вместо того, чтобы заполнять 0 в отсутствующих слотах, мы заполняем точку местоположения предыдущих временных интервалов.
Используйте DataFrame.asfreq
в DataFrame.groupby
:
df1 = (df.groupby('User')['Location']
.apply(lambda x: x.asfreq(freq='H',method='ffill'))
.reset_index())
print (df1.head(10))
User time_slot Location
0 1 2017-10-26 00:00:00 156
1 1 2017-10-26 01:00:00 156
2 1 2017-10-26 02:00:00 156
3 1 2017-10-26 03:00:00 156
4 1 2017-10-26 04:00:00 156
5 1 2017-10-26 05:00:00 156
6 1 2017-10-26 06:00:00 156
7 1 2017-10-26 07:00:00 156
8 1 2017-10-26 08:00:00 156
9 1 2017-10-26 09:00:00 156
Деталь:
print (df.index)
DatetimeIndex(['2017-10-26 00:00:00', '2017-10-26 10:00:00',
'2017-10-26 12:00:00', '2017-10-27 02:00:00',
'2017-10-27 16:00:00', '2017-10-27 23:00:00',
'2017-10-26 00:00:00', '2017-10-26 02:00:00',
'2017-10-26 10:00:00', '2017-10-27 01:00:00',
'2017-10-27 04:00:00', '2017-10-27 18:00:00',
'2017-10-26 07:00:00', '2017-10-26 09:00:00',
'2017-10-26 14:00:00', '2017-10-27 06:00:00',
'2017-10-27 23:00:00'],
dtype='datetime64[ns]', name='time_slot', freq=None)
@Krush23 - Нет проблем, теперь это проще
Как мы можем установить диапазон для даты, например: если у нас есть данные за 7 дней, а мне нужно только 3 дня, а частота - 15-минутные временные интервалы.
@ Krush23 - 3 дня указываются датами типа L = ['2017-10-25','2017-10-26','2017-10-27']
или понедельником, вторником, четвергом? Или разные?
Это даты вроде 2017-10-25.
@Krush23 - тогда используйте L = ['2017-10-25','2017-10-26'] df = df[df.index.floor('d').isin(pd.to_datetime(L))]
и последний df = df.groupby('User')['Location'].apply(lambda x: x.asfreq(freq='15Min', method='ffill')).reset_index()
Извините за беспокойство. 24:00 нет. Время с 00 до 23.