2016-06-22 7 views
0

私は同様の質問が尋ねられ応答したのを見ました。しかし、私の特定のニーズに答える答えはありません。インポートされたcsvsからのパンダデータフレームの再帰的なマージ

私のニーズに合わせて調整した次のコードは、ファイルと関連する列を正常にインポートします。ただし、dfに行を追加し、キーに基づいてこれらの列をマージしません。

import glob 
import pandas as pd 
import os 

path = r'./csv_weather_data'    
all_files = glob.glob(os.path.join(path, "*.csv")) 
df = pd.concat(pd.read_csv(f, skiprows=47, skipinitialspace=True, usecols=['Year','Month','Day','Hour','DBT'],) for f in all_files) 

典型的なデータ構造は以下の通りです:

Year  Month  Day  Hour  DBT 
1989  1   1  0  7.8 
1989  1   1  100  8.6 
1989  1   1  200  9.2 

私は次のことを達成したいと思います:

  1. 輸入

  2. dfをパンダにフォルダに含まれるすべてのCSVファイル
  3. 最初の4列をdatetime値の1列にマージする

  4. インポートされたcsvをマージし、新しく作成したdatetime値をインデックスとして使用し、DBT列をインポートします。各DBT列はインポートされたcsvの名前です(天気ファイルの乾球温度DBT) 。

アドバイスはありますか?

+0

あなたはpd.read_csv(... 'と最初の3つの列をマージすることができ、parse_dates = { '日':[0、 1、2]}) ')が、100または200の時間は何を意味しますか?明らかにこれは24時間の計量ではありません。 – chrisaycock

+0

ありがとうございます。 00は分(200は午前2時、2200は午後10時)です。 構文解析日付は完全に機能しました! 再帰的マージを設定するにはどうしたらいいですか? * pd.concat *とは対照的に、空のデータフレームから始まる行をマージして最初に空ではないデータフレームがあることを理解しています – Andreuccio

+0

'補助変数'を設定する方法はありますか( '* f1 * ')、ループサイクル内で最初のfの値が割り当てられますか? – Andreuccio

答えて

0

次の2つの手順で問題を分割する必要があります

まず、あなたのインポート機能を定義します。ここではdatetimeを定義する必要があり、setはインデックスとして使用されます。

def my_import(f): 

    df = pd.read_csv(f, skiprows=47, skipinitialspace=True, usecols=['Year','Month','Day','Hour','DBT'],) 

    df.loc[:, 'Date'] = pd.to_datetime(df.apply(lambda x : str(int(x['Year']))+str(int(x['Month']))+str(int(x['Day']))+str(int(x['Hour'])), axis = 1), format = '%Y%m%d%H') 
    df.drop(['Year', 'Month', 'Day', 'Hour'], axis = 1, inplace = True) 
    df.set_index('Date') 
    return df 

は、その後、あなたが列によって連結(軸= 1)

df = pd.concat({f : my_import(f) for f in all_files}, axis = 1) 
+0

FLAB、ありがとうございました。私は実行しようとし、次のエラーを取得しています。 ' "とValueError:未変換データが残っている:0"' また、あなたは私の式がどうなるのかを理解する助けてくださいことができます: '(ラムダX:STR(INT(X [ '年']))+ STR str(int(x ['Month']))+ str(int(x ['Day']) – Andreuccio

関連する問題