#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)