为datafram中的每个ID创建一个dateTime

2024-10-01 04:47:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从2016/1/1 00:00到2018/11/25 23:00的数据帧(namenddf),每小时有一个时间戳、object\u id和一个值。数据集只包含对象id有值的行

timestampHour     object_id  value
2016/1/1 00:00    1          2
2016/1/1 00:00    3          1
2016/1/1 01:00    1          1
2016/1/1 01:00    2          3
2016/1/1 02:00    2          3
2016/1/1 02:00    3          2

我想得到一个数据帧,显示每小时的所有对象id,如果没有值,则使用空值

timestampHour     object_id  value
2016/1/1 00:00    1          2
2016/1/1 00:00    2          null
2016/1/1 00:00    3          1
2016/1/1 01:00    1          1
2016/1/1 01:00    2          3
2016/1/1 01:00    3          null
2016/1/1 02:00    1          null
2016/1/1 02:00    2          3
2016/1/1 02:00    3          2

我已经根据时间戳创建了dateTime。并用以下代码将它们四舍五入到小时:

df["timestamp"] = pd.to_datetime(df["result_timestamp"])
df['timestampHour'] = df['result_timestamp'].dt.round('60min')

(我不知道是否有更好的选择,但我一直在尝试创建timestampHour行,直到12(我有12个每个唯一的对象\u id)并用(该小时的)未使用的对象\u id填充这些新创建的行。但我无法创建空行,条件是)

我是一个相当新的编程,我没有找到一个线索来接近解决这个问题,从搜索其他职位


Tags: 数据对象iddfobjectvalue时间result
2条回答

使用pivot_tableunstack

df.pivot_table(
    index='object_id',  columns='timestampHour', values='value'
).unstack().rename('value').reset_index()

    timestampHour  object_id  value
0  2016/1/1 00:00          1    2.0
1  2016/1/1 00:00          2    NaN
2  2016/1/1 00:00          3    1.0
3  2016/1/1 01:00          1    1.0
4  2016/1/1 01:00          2    3.0
5  2016/1/1 01:00          3    NaN
6  2016/1/1 02:00          1    NaN
7  2016/1/1 02:00          2    3.0
8  2016/1/1 02:00          3    2.0

要了解这一点的原因,可以查看中间的pivot_table

timestampHour  2016/1/1 00:00  2016/1/1 01:00  2016/1/1 02:00
object_id
1                         2.0             1.0             NaN
2                         NaN             3.0             3.0
3                         1.0             NaN             2.0

如果没有为object_idtimestampHour的组合找到值,则将NaN添加到表中。当您使用unstack时,这些NaN会被保留,这样您就可以得到所需的结果,并表示缺少的值

这也是两个水平的笛卡尔积This question详细介绍了针对大型数据集优化产品性能的方法

import pandas as pd

id_cols = ['timestampHour', 'object_id']
idx = pd.MultiIndex.from_product(df[id_cols].apply(pd.Series.unique).values.T, names=id_cols)

df.set_index(id_cols).reindex(idx).reset_index()

输出:

    timestampHour  object_id  value
0  2016/1/1 00:00          1    2.0
1  2016/1/1 00:00          3    1.0
2  2016/1/1 00:00          2    NaN
3  2016/1/1 01:00          1    1.0
4  2016/1/1 01:00          3    NaN
5  2016/1/1 01:00          2    3.0
6  2016/1/1 02:00          1    NaN
7  2016/1/1 02:00          3    2.0
8  2016/1/1 02:00          2    3.0

相关问题 更多 >