как создать строку для каждой даты-времени и каждого идентификатора?

#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