python-3.x - 将一年的数据框转换为 365 列的数据框(按天计算)
问题描述
我有一个时间间隔为 5 分钟的数据框。然而,所有的间隔都不存在。例子:
Date Value_1
...
2019-01-01 15:30:00 2.4866
2019-01-01 15:35:00 2.703
2019-01-01 15:40:00 0.0
2019-01-02 09:05:00 8.3087
2019-01-02 09:10:00 7.5134
2019-01-02 09:15:00 6.637
...
我想知道是否有一种简单的方法或一个函数(我没有找到任何东西)来拥有一个仅基于时间的 288 个间隔的数据帧
00:00:00
00:05:00
00:10:00
...
23:50:00
23:55:00
其中每一列是一天(一年 365)。最后我想用前一个填充这个数据框。如果没有可用数据,它可能是 nan 或 0。
谢谢你。
编辑:更改初始数据框以按日期仅考虑一个值
解决方案
您可以set_index
仅使用time
来自日期时间列的第一级和date
同一列的第二级来执行此操作。然后unstack
:
#sample dataframe
np.random.seed(1)
drange = pd.date_range('2019-01-01 09:30:00', freq='5T', periods=5)
df = pd.DataFrame({'datetime': drange.tolist() + (drange+pd.DateOffset(days=1)).tolist(),
'Value_1':np.random.randint(10, size=10),})
print (df)
datetime Value_1
0 2019-01-01 09:30:00 5
1 2019-01-01 09:35:00 8
2 2019-01-01 09:40:00 9
3 2019-01-01 09:45:00 5
4 2019-01-01 09:50:00 0
5 2019-01-02 09:30:00 0
6 2019-01-02 09:35:00 1
7 2019-01-02 09:40:00 7
8 2019-01-02 09:45:00 6
9 2019-01-02 09:50:00 9
# set_index and unstack
df_f = df.set_index([df['datetime'].dt.time,
df['datetime'].dt.date])['Value_1']\
.unstack()
print (df_f)
datetime 2019-01-01 2019-01-02
datetime
09:30:00 5 0
09:35:00 8 1
09:40:00 9 7
09:45:00 5 6
09:50:00 0 9
然后,如果您想在索引中创建所有 5 分钟并在列中创建每一天,您可以使用reindex
and ffill
:
df_f = df_f.reindex(index=pd.date_range('2019-01-01 00:00:00',
freq='5T', periods=288).time,
columns=pd.date_range('2019-01-01',
freq='D', periods=365).date)\
.ffill()
推荐阅读
- ios - 如何确定用户之前是否订阅过 - RevenueCat
- graphql - @apollo/federation 使用文档中的示例引发错误
- terraform - 从现有基础架构生成配置
- ethereum - ENS 名称反向不适用于以太坊地址
- wordpress - 在“woocommerce_add_to_cart_redirect”过滤器上,获取添加/修改的购物车项目
- powershell - 为什么我的外变量变成废话?
- r - 如何将栅格数据框与 shapefile 相结合以创建物种丰富度地图?
- php - 我想在我的开源社交网络项目中嵌入自定义表情符号
- c# - Razor如何在提交表单后将对象从模型源传递到目标模型
- unity3d - 统一构建时的多个版本的 gradle 插件