我有这个问题,我正在尝试使用以下结构转换数据帧(从具有数百万行的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用户),所以我希望有一个更好的(矢量化的)和更优雅的解决方案。
先谢谢您!
答案 0 :(得分:2)
我将使用date_range
在新列New
中创建所有日期时间,然后使用unnesting
和pivot_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