#python #pandas #datetime
Вопрос:
Что У Меня Есть?
У меня есть 2 даты — start_date
end_date
и список удостоверений личности.
Чего Я Хочу?
Я хочу создать a DataFrame
со строкой для каждой даты и времени с интервалом в 15 минут между start_date
и end_date
и для каждого идентификатора в списке идентификаторов
Я написал следующую функцию:
def daterange(start_date, end_date, minutes, id_list):
lst = []
delta = timedelta(minutes=minutes)
while start_date < end_date:
lst.append(start_date)
start_date = delta
df1 = pd.DataFrame({'Time':lst})
df2 = pd.DataFrame({'id': id_list})
df_time = pd.DataFrame(columns=['Time','id'])
prod = product(df1.values, df2.values)
for index, i in enumerate(prod):
df_time.loc[index] = [i[0][0], i[1][0]]
return df_time
но в моем списке идентификаторов более 200 идентификаторов, а мои даты рассчитаны на целый год с интервалом в 15 минут, поэтому для запуска требуется много времени. есть ли лучший способ достичь этого?
Комментарии:
1. Вы можете использовать
pd.date_range(start, end, freq='15min')
. Можете ли вы добавить ожидаемый результат для некоторого примера ввода?
Ответ №1:
Та же функция с той же сигнатурой:
def daterange(start_date, end_date, minutes, id_list):
dti = pd.date_range(start_date, end_date, freq=f'{minutes}T', closed='left')
idx = pd.MultiIndex.from_product([dti, id_list], names=['Time', 'id'])
return idx.to_frame().reset_index(drop=True)
>>> daterange('2021-01-06', '2021-01-07', 360, [1, 2, 3])
Time id
0 2021-01-06 00:00:00 1
1 2021-01-06 00:00:00 2
2 2021-01-06 00:00:00 3
3 2021-01-06 06:00:00 1
4 2021-01-06 06:00:00 2
5 2021-01-06 06:00:00 3
6 2021-01-06 12:00:00 1
7 2021-01-06 12:00:00 2
8 2021-01-06 12:00:00 3
9 2021-01-06 18:00:00 1
10 2021-01-06 18:00:00 2
11 2021-01-06 18:00:00 3