为数据框中的每个ID创建一个dateTime

时间:2018-12-05 16:32:32

标签: python pandas dataframe

我有一个从2016/1/1 00:00到2018/11/25 23:00的数据帧(名称为df),每小时带有一个时间戳,object_id和一个值。数据集仅包含其中object_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行(每个唯一的object_id我有12条),并用(在那一小时内)未使用的object_id填充那些新创建的行。但是我无法创建带有条件的空行)

我对编程还不是很陌生,也没有找到通过搜索其他帖子来解决这个问题的线索。

2 个答案:

答案 0 :(得分: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会保留下来,从而为您提供期望的结果,并显示缺失的值。

答案 1 :(得分:0)

这也是.reindex,具有两个级别的笛卡尔积。 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