【问题标题】:python - transform df to time seriespython - 将df转换为时间序列
【发布时间】:2021-08-02 23:25:47
【问题描述】:

我有一个描述交易的 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 在交易中是线性的。我想将其转换为具有一天粒度的时间序列。一天内的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

【问题讨论】:

  • 看起来您缺少给定数据集的日期列
  • 您应该解释一下输出以及它与输入的关系。
  • 对不起,我试着把它说得更清楚。

标签: python-3.x pandas time-series


【解决方案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)

【讨论】:

    猜你喜欢
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 2018-08-30
    • 2021-08-11
    • 2016-11-22
    • 1970-01-01
    相关资源
    最近更新 更多