2014-03-28 33 views
1

讀取列中具有時間值的csv文件並儘可能高效地獲取具有1列值和日期時間索引的數據幀。我做了一個read_csv,然後是一個堆棧和下面的函數,但它更多的是時間和內存的消耗。太長的數據框應用行函數

有人有更好的方法來做到這一點?

df.apply(lambda row: row['DATE'] + relativedelta(hours = int(row['level_2'][2:])), axis=1) 

DATE  H01 H02 H03 H04 ... 
2014/01/01 1.2 2.4 3.3 4.1 
2014/01/02 4.3 2.6 3.2 4.1 

並獲得:

DATE 
2014-01-01 00:00:00 1.2 
2014-01-01 01:00:00 2.4 
2014-01-01 02:00:00 3.3 
2014-01-01 03:00:00 4.1 
+0

是否有24列? (即每個小時是否有一列?) –

+0

對於這兩種情況都有答案,我想知道是否應該有更好的方法。 –

回答

1

如果每個小時(即24)有一列,並且每個日期都存在,那麼你會更好地進行numpy的重塑(它會快得多),並通過date_range生成DatetimeIndex。

假設日期是索引(這是一個DatetimeIndex)和其他24列是小時:

vals = df.values.reshape(-1) 
new_index = pd.date_range(start=df.index[0], periods=24*len(df), freq='H') 
pd.Series(vals, new_index) 

否則,您可以使用itertools產品創建新的索引....我會先使列營業時間:

df.columns = np.arange(0, len(df.columns)) * pd.offsets.Hour(1) 

In [11]: df 
Out[11]: 
      <0 * Hours> <Hour> <2 * Hours> <3 * Hours> 
DATE              
2014-01-01   1.2  2.4   3.3   4.1 
2014-01-02   4.3  2.6   3.2   4.1 

注:同樣,至關重要的是,日期是DatetimeIndex這裏。

from itertools import product 
new_index = [t + td for t, td in product(df.index, df.columns)] 

In [21]: pd.Series(df.values.reshape(-1), new_index) 
Out[21]: 
2014-01-01 00:00:00 1.2 
2014-01-01 01:00:00 2.4 
2014-01-01 02:00:00 3.3 
2014-01-01 03:00:00 4.1 
2014-01-02 00:00:00 4.3 
2014-01-02 01:00:00 2.6 
2014-01-02 02:00:00 3.2 
2014-01-02 03:00:00 4.1 
dtype: float64