首页 > 解决方案 > 如何创建具有不同时期索引的数据框

问题描述

我有一个数据框,每一行代表一个由 pbs 生成的记录。现在我想知道每个时间段(30 分钟)的运行核心。我的表的前 4 行:

datetime    walltime    ncores
2019-07-18 11:18:27 2:05:10     2
2019-07-18 11:18:45 00:50:27    1
2019-07-18 11:18:46 00:07:20    1
2019-07-18 11:18:50 00:31:34    1

我发现不可能用(每条记录中的 used-walltime 不一致)的PeriodIndex元素。Peroid

我想我可以创建一个PeriodIndex频率为 的30 minutes,然后将一个 certian 中所有记录的核心数分配给Period对应的Period. 但我无法弄清楚如何做到这一点。

我的预期是:

    datetime cputime    ncores
    2019-07-18 11:0:00      5
    2019-07-18 11:30:00     4
    2019-07-18 12:00:00     3
    2019-07-18 12:30:00     2

标签: pandasnumpydataframetime-seriestimespan

解决方案


我认为你需要:

#convert to datetimes and timedeltas
df['datetime'] = pd.to_datetime(df['datetime'])
df['walltime'] = pd.to_timedelta(df['walltime'])

#create end time with flooring by 30min
df['end'] = df['datetime'].dt.floor('30min') + df['walltime']

#list by 30minutes period
zipped = zip(df['datetime'], df['end'], df['ncores'])
L = [(i, n) for s, e, n in zipped for i in pd.period_range(s, e, freq='30min')]

#DataFrame is aggregated by sum
df1 = (pd.DataFrame(L, columns=['datetime cputime', 'summed'])
        .groupby('datetime cputime', as_index=False)['summed']
        .sum())
print (df1)
   datetime cputime  summed
0  2019-07-18 11:00       5
1  2019-07-18 11:30       4
2  2019-07-18 12:00       3
3  2019-07-18 12:30       2
4  2019-07-18 13:00       2

推荐阅读