2013-03-15 13 views
13

私は次のデータフレームを.csvファイルから読み込み、 "日付"列をインデックスとして使用します。日は行にあり、列にはその日の時間の値が表示されます。python pandasデータフレームをどのように並べ替えるのですか?

> Date   h1 h2 h3 h4 ... h24 
> 14.03.2013 60 50 52 49 ... 73 

日付/時刻の1列と1つのインデックス列があるように私は私が使用してそれをしようとしていたシーケンス内の値で、このようにそれを配置する

>Date/Time   Value 
>14.03.2013 00:00:00 60 
>14.03.2013 01:00:00 50 
>14.03.2013 02:00:00 52 
>14.03.2013 03:00:00 49 
>. 
>. 
>. 
>14.03.2013 23:00:00 73 

をしたいと思いますデータフレームを通過する2つのループ。 パンダでこれを行う簡単な方法はありますか?

答えて

15

私は日付の操作ではベストではないんだけど、多分このような何か:

import pandas as pd 
from datetime import timedelta 

df = pd.read_csv("hourmelt.csv", sep=r"\s+") 

df = pd.melt(df, id_vars=["Date"]) 
df = df.rename(columns={'variable': 'hour'}) 
df['hour'] = df['hour'].apply(lambda x: int(x.lstrip('h'))-1) 

combined = df.apply(lambda x: 
        pd.to_datetime(x['Date'], dayfirst=True) + 
        timedelta(hours=int(x['hour'])), axis=1) 

df['Date'] = combined 
del df['hour'] 

df = df.sort("Date") 

いくつかの説明が続きます。

>>> import pandas as pd 
>>> from datetime import datetime, timedelta 
>>> 
>>> df = pd.read_csv("hourmelt.csv", sep=r"\s+") 
>>> df 
     Date h1 h2 h3 h4 h24 
0 14.03.2013 60 50 52 49 73 
1 14.04.2013 5 6 7 8 9 

から始まっ

私たちは、その値を1列に時間の列を作るためにpd.meltを使用することができます。

>>> df = pd.melt(df, id_vars=["Date"]) 
>>> df = df.rename(columns={'variable': 'hour'}) 
>>> df 
     Date hour value 
0 14.03.2013 h1  60 
1 14.04.2013 h1  5 
2 14.03.2013 h2  50 
3 14.04.2013 h2  6 
4 14.03.2013 h3  52 
5 14.04.2013 h3  7 
6 14.03.2013 h4  49 
7 14.04.2013 h4  8 
8 14.03.2013 h24  73 
9 14.04.2013 h24  9 

は、それらのh Sを取り除く:

>>> df['hour'] = df['hour'].apply(lambda x: int(x.lstrip('h'))-1) 
>>> df 
     Date hour value 
0 14.03.2013  0  60 
1 14.04.2013  0  5 
2 14.03.2013  1  50 
3 14.04.2013  1  6 
4 14.03.2013  2  52 
5 14.04.2013  2  7 
6 14.03.2013  3  49 
7 14.04.2013  3  8 
8 14.03.2013 23  73 
9 14.04.2013 23  9 

2つの列を日付として結合します。

>>> combined = df.apply(lambda x: pd.to_datetime(x['Date'], dayfirst=True) + timedelta(hours=int(x['hour'])), axis=1) 
>>> combined 
0 2013-03-14 00:00:00 
1 2013-04-14 00:00:00 
2 2013-03-14 01:00:00 
3 2013-04-14 01:00:00 
4 2013-03-14 02:00:00 
5 2013-04-14 02:00:00 
6 2013-03-14 03:00:00 
7 2013-04-14 03:00:00 
8 2013-03-14 23:00:00 
9 2013-04-14 23:00:00 

再アセンブルし、クリーンアップは:

>>> df['Date'] = combined 
>>> del df['hour'] 
>>> df = df.sort("Date") 
>>> df 
       Date value 
0 2013-03-14 00:00:00  60 
2 2013-03-14 01:00:00  50 
4 2013-03-14 02:00:00  52 
6 2013-03-14 03:00:00  49 
8 2013-03-14 23:00:00  73 
1 2013-04-14 00:00:00  5 
3 2013-04-14 01:00:00  6 
5 2013-04-14 02:00:00  7 
7 2013-04-14 03:00:00  8 
9 2013-04-14 23:00:00  9 
+0

ニースのソリューション!あなたは 'df ['hour'] apply(...)'と 'combined = ...'行を 'df ['Date'] + = df ['hour']に組み合わせることができます。apply(lambda x: timedelta(hours = int(x.lstrip( 'h')) - )) '。 – unutbu

+0

すばらしい解決策。どうもありがとう。私はちょうどインデックスとして日付を設定して、それは完全に動作します。 > df = df.set_index( 'Date') –

1

あなたはいつも時間ごとdata_arrayを取得し、それを平らにできます。新しいDatetimeIndexを時間別の周波数で生成します。

df = df.asfreq('D') 
hourly_data = df.values[:, :] 
new_ind = pd.date_range(start=df.index[0], freq="H", periods=len(df) * 24) 
# create Series. 
s = pd.Series(hourly_data.flatten(), index=new_ind) 

私は、read_csvが '日付'列を解析してそれをインデックスにしていると仮定しています。あなたが欠けている日がある場合、new_indが正しく並ぶように、私たちは 'D'の頻度に変更します。行方不明の日はnp.nanで埋められ、s.dropna()で削除できます。

notebook link

関連する問題