如何在 Python 中使用 Pandas 有效地将数据框重组为日期时间条目?

我有以下数据框:

http://img.mukewang.com/633d461f000188fe05310356.jpg

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

http://img3.mukewang.com/633d46290001cf7605620450.jpg

电台的名称并不重要,我不得不使用另一个文件来展示一个工作示例。


第一个数据框有 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:抱歉图片不好,我使用的是远程计算机,无法获得好的屏幕截图。


尚方宝剑之说
浏览 58回答 1
1回答

慕娘9325324

您可以使用melt和pivot_table# setup the initial dataframedates = 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    value0   2018-01-01  O   0   0.3404321   2018-01-01  E   0   0.8650122   2018-01-01  L   0   0.9949353   2018-01-02  O   0   0.2745604   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           ODate2           2018-01-01 00:00:00 0.865012    0.994935    0.3404322018-01-01 01:00:00 0.167927    0.605892    0.2711392018-01-01 02:00:00 0.314101    0.473481    0.0366932018-01-01 03:00:00 0.060521    0.462390    0.0730772018-01-01 04:00:00 0.799032    0.420461    0.52114
打开App,查看更多内容
随时随地看视频慕课网APP