python - 如何在 Python 中使用 Pandas 有效地将数据框重组为日期时间条目?
问题描述
我有以下数据框:
我希望它看起来像这样(日期索引,站列):
电台的名称并不重要,我不得不使用另一个文件来展示一个工作示例。
第一个数据框有 0-23 列,代表一天中的几个小时。它还在每一行中都有日期和车站(位置)信息。我需要让索引(或一行)是一个日期时间,它结合了列中的小时和行中的日期。我需要每个站都是一列而不是存储在行中。
我使用下面的代码来实现它,但即使处理少量的行也需要很长时间。
import os
import pandas as pd
idx = pd.IndexSlice
df=pd.read_csv(os.path.join(filepath,newfilename)) # get data
df=df[df['POC']==1] #only keep primary intrument at each site
cols=['Site AQS', 'Date (LST)', '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18',
'19', '20', '21', '22', '23']
df=df[cols] #subset to only relevant columns
df_align1=pd.pivot_table(df,index='Date (LST)',columns=['Site AQS']) #pivot data to easier view
ozone_df=pd.DataFrame() #create ouput df
for date in df_align1.index:
for station in df_align1.columns.get_level_values(1):
for i in df_align1.columns.get_level_values(0):
ozone_df.loc[pd.to_datetime(date+' '+str(i)+':00'),station]=df_align1.loc[date,idx[i, station]]
这是我的示例数据的链接,因此您可以测试我编写的代码。
https://drive.google.com/file/d/11Lzl_m_EBCxoBEutl0UP6_TKq6TNgVZI/view?usp=sharing
PS:抱歉图片不好,我使用的是远程计算机,无法获得好的屏幕截图。
解决方案
您可以使用melt
和pivot_table
# setup the initial dataframe
dates = np.repeat(pd.date_range(start='1/1/2018', end='1/03/2018'), 3)
stations = np.tile(['O', 'E', 'L',], 3)
vals = np.random.rand(len(dates),len(cols))
df = pd.DataFrame(vals)
df.insert(0, 'Date', dates)
df.insert(1, 'Station', stations)
融化数据框
melted = df.melt(id_vars=['Date', 'Station'], value_vars=df.columns[2:])
现在数据看起来像这样
Date Station variable value
0 2018-01-01 O 0 0.340432
1 2018-01-01 E 0 0.865012
2 2018-01-01 L 0 0.994935
3 2018-01-02 O 0 0.274560
4 2018-01-02 E 0 0.096046
接下来,您需要从日期和变量创建新的日期列(前列 0-23)
melted['Date2'] = melted['Date'] + pd.to_timedelta(melted['variable'].astype(int), unit='hours')
最后,创建一个以站点为列的数据透视表
melted.pivot_table(index='Date2', columns='Station', values='value')
现在数据看起来像这样
Station E L O
Date2
2018-01-01 00:00:00 0.865012 0.994935 0.340432
2018-01-01 01:00:00 0.167927 0.605892 0.271139
2018-01-01 02:00:00 0.314101 0.473481 0.036693
2018-01-01 03:00:00 0.060521 0.462390 0.073077
2018-01-01 04:00:00 0.799032 0.420461 0.52114
推荐阅读
- javascript - 在 Ember Qunit 测试中获取弹出模式内部 HTML
- php - 按日期范围和关键字搜索
- c# - EditorConfig 函数调用的每个参数的新行
- plc - FB_FileClose 只是第一次忙
- azure - 如何在具有相同模板的 HDI 集群的 VM 扩展脚本中添加dependsOn
- vim - VIM 忽略我在 ~/.vimrc 中的选项卡相关设置(并且没有设置粘贴)
- python - django:静态文件夹中的 css 显示 404 错误,但不显示 js 文件
- visual-studio-code - 如何通过 VSCode 中的“附加”调试由不同应用程序(Resco MobileCRM)运行的 Javascript?
- arrays - 如何在 AngularJS 中解析 JSON 数组
- xamarin - xamarin 形式的实时视频流