Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用Pandas有效地将数据帧重新组织为日期时间项?_Python_Pandas_Performance_Dataframe_Pivot - Fatal编程技术网

如何在Python中使用Pandas有效地将数据帧重新组织为日期时间项?

如何在Python中使用Pandas有效地将数据帧重新组织为日期时间项?,python,pandas,performance,dataframe,pivot,Python,Pandas,Performance,Dataframe,Pivot,我有以下数据帧: 我希望它看起来像这样(日期索引、站点列): 站点的名称并不重要,我必须使用另一个文件来显示一个工作示例 第一个数据帧有0-23列,表示一天中的小时数。它在每行中还包含日期和站点(位置)信息。我需要索引(或一行)是一个日期时间,它结合了列中的小时和行中的日期。我需要每个站都是一列,而不是存储在行中 我使用了下面的代码来实现它,但是处理少量的行也需要很长的时间 import os import pandas as pd idx = pd.IndexSlice df=pd.re

我有以下数据帧:

我希望它看起来像这样(日期索引、站点列):

站点的名称并不重要,我必须使用另一个文件来显示一个工作示例

第一个数据帧有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]]
这里是我的示例数据的链接,您可以测试我编写的代码


PS:很抱歉图像不好,我使用的是远程计算机,无法获得良好的屏幕截图。

您可以使用
melt
pivot\u 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
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
接下来,您需要根据日期和变量(前列0-23)创建新的日期列

最后,创建一个以桩号为列的透视表

melted.pivot_table(index='Date2', columns='Station', values='value')
现在数据看起来像这样

    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
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

您可以使用
melt
pivot\u表

# 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
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
接下来,您需要根据日期和变量(前列0-23)创建新的日期列

最后,创建一个以桩号为列的透视表

melted.pivot_table(index='Date2', columns='Station', values='value')
现在数据看起来像这样

    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
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