python — преобразование df во временные ряды

#python-3.x #pandas #time-series

Вопрос:

У меня есть df, описывающий транзакции, такие как

 transaction   start_in_s_since_epoch    duration_in_s    charged_energy_in_wh
1             1.457423e 09              1821.0           1732
2             1.457389e 09              35577.0          18397
3             1.457425e 09              2.0              0
[...]
 

Я предполагаю, что charged_energy линейно распределяется по транзакции. Я хотел бы преобразовать его во временной ряд с детализацией в один день. заряд_энергии в течение дня должен быть суммирован, а также продолжительность.

 day                sum_duration_in_s   sum_charged_energy_in_wh
2016-03-16 00:00   123                 456
2016-03-17 00:00   456                 789
2016-03-18 00:00   789                 012
[...]
 

Есть идеи? Я борюсь с границами между днями. Эта сделка с

 transaction   start_in_s_since_epoch    duration_in_s    charged_energy_in_wh
500             1620777300              600              1000
 

должны быть поровну разделены на

 day                sum_duration_in_s   sum_charged_energy_in_wh
2021-05-11 00:00   300                 500
2021-05-11 00:00   300                 500

 

Комментарии:

1. похоже, вам не хватает столбца даты для данного набора данных

2. Вероятно, вам следует объяснить выход и то, как он связан с вводом.

3. Извините, я пытался объяснить это яснее.

Ответ №1:

Это сделало это за меня. Медленная автофокусировка, но работает:

 from datetime import datetime
from datetime_truncate import truncate

df_tmp = pd.DataFrame()

for index, row in df.iterrows():
    day_in_s = 60*60*24
    start = row.start_in_s_since_epoch
    time = row.duration_in_s
    energy_per_s = row.charged_energy_in_wh / row.duration_in_s
    till_midnight_in_s = truncate(pd.to_datetime(start   day_in_s, unit='s'), 'day').timestamp() - start

    rest_in_s = time - till_midnight_in_s
    
    data = {'day':truncate(pd.to_datetime(start, unit='s'), 'day'),
            'sum_duration_in_s':min(time, till_midnight_in_s),
            'sum_charged_energy_in_wh':min(time, till_midnight_in_s) * energy_per_s}
    df_tmp = df_tmp.append(data, ignore_index=True) 
    
    while rest_in_s > 0:
        start  = day_in_s
        data = {'day':truncate(pd.to_datetime(start, unit='s'), 'day'),
                'sum_duration_in_s':min(rest_in_s, day_in_s),
                'sum_charged_energy_in_wh':min(rest_in_s, day_in_s) * energy_per_s}
        df_tmp = df_tmp.append(data, ignore_index=True)  
        rest_in_s = rest_in_s - day_in_s
        
df_ts = df_tmp.groupby(['date']).agg({'sum_charged_energy_in_wh':sum,
                                      'sum_duration_in_s':sum}).sort_values('date')

df_ts = df_ts.asfreq('D', fill_value=0)