使用熊猫按照时间序列数组中的周期转换数据帧

时间:2019-01-10 20:26:38

标签: python pandas

我有这个问题,我正在尝试使用以下结构转换数据帧(从具有数百万行的CSV文件加载):

| start               | end                 | type | value |
|---------------------|---------------------|------|-------|
| 2016-01-01 00:00:00 | 2016-01-02 00:00:00 | 0    | 200   |
| 2016-01-02 01:00:00 | 2016-01-03 00:00:00 | 1    | 100   |
| 2016-01-15 08:00:00 | 2016-01-16 07:00:00 | 0    | 15    |
| 2016-01-16 07:00:00 | 2016-01-16 07:00:00 | 2    | 80    |

我想将其转换为以下格式的结构:

| timestamp           | 0   | 1   | 2 |
|---------------------|-----|-----|---|
| 2016-01-01 00:00:00 | 200 | 0   | 0 |
| ...                 | 200 | 0   | 0 |
| 2016-01-02 00:00:00 | 200 | 0   | 0 |
| 2016-01-02 01:00:00 | 0   | 100 | 0 |
| ...                 | 0   | 100 | 0 |
| 2016-01-03 00:00:00 | 0   | 100 | 0 |
| ...                 | 0   | 0   | 0 |
| 2016-01-15 08:00:00 | 15  | 0   | 0 |

换句话说,虽然第一个表使用其type指定了value N事件的开始和结束时间,但我希望最后有一个范围为每个事件的datetimes为所有事件包括的值。

我正在尝试找到一种有效的解决方案,而我找到的最好的解决方案是基于从日期时间到整数的转换(使用自基准日期以来的小时数),然后将该值用作{{1 }}数组。不幸的是,我的代码使用了for循环,我想知道是否可以提出更好的建议。

numpy

从日期时间到整数的转换基于this SO question。 我在Python方面的经验有限(我主要是R用户),所以我希望有一个更好的(矢量化的)和更优雅的解决方案。

先谢谢您!

1 个答案:

答案 0 :(得分:2)

我将使用date_range在新列New中创建所有日期时间,然后使用unnestingpivot_table

df['New']=[pd.date_range(x,y,freq='H') for x , y in zip(df.start,df.end)]
yourdf=unnesting(df,['New']).pivot_table(values='x',index='New',columns='id',aggfunc='sum',fill_value=0)
yourdf.head()
Out[327]: 
id                     0    1   2
New                              
2016-01-01 00:00:00  200    0   0
2016-01-01 01:00:00  200    0   0
2016-01-01 02:00:00  200    0   0
2016-01-01 03:00:00  200    0   0