2016-01-04 26 views
0

我有一個熊貓數據框,其中〜3900行,6列從Google Finance編譯。其中一列以unix格式定義了一個時間,具體定義了市場交易日的時間。在這種情況下,從930A EST到4P EST的DJIA。然而,只有每天開始時(930A)的單元格才具有完整的unix時間戳(以「a」爲前綴),其他時間是一天中第一個時間之後的分鐘。根據前一行中的值操縱熊貓數據框單元格的值,無需迭代

這裏是原始數據的示例:

  Date Close High  Low Open Volume 
0 a1450449000 173.87 173.87 173.83 173.87 46987 
1   1 173.61 173.83 173.55 173.78 19275 
2   2 173.37 173.63 173.37 173.60 16014 
3   3 173.50 173.59 173.31 173.34 14198 
4   4 173.50 173.57 173.46 173.52 7010 
      Date Close High  Low Open Volume 
388   388 171.16 171.27 171.15 171.26 11809 
389   389 171.11 171.23 171.07 171.18 30449 
390   390 170.89 171.16 170.89 171.09 163937 
391 a1450708200 172.28 172.28 172.28 172.28 23880 
392   1 172.27 172.27 172.00 172.06 2719 

的變化在索引391是不連續的,使得像@ Stefan的將不幸的是沒有正確調整Date值的溶液中。

我可以很容易地足以與通過線路的λ和線經過刪除的「a」(如有必要)的值轉換爲整數和過去930A分鐘轉換爲秒用下面的代碼:

import pandas as pd 
import numpy as np 
import datetime 

bars = pd.read_csv(r'http://www.google.com/finance/getprices?i=60&p=10d&f=d,o,h,l,c,v&df=cpct&q=DIA', skiprows=7, header=None, names=['Date', 'Close', 'High', 'Low', 'Open', 'Volume']) 

bars['Date'] = bars['Date'].map(lambda x: int(x[1:]) if x[0] == 'a' else int(x))  
bars['Date'] = bars['Date'].map(lambda u: u * 60 if u < 400 else u) 

現在我想要做的是,不迭代數據幀,確定bars ['Date']的值是否不是一個unix時間戳(例如< 24000就此數據集而言)。如果是這樣,我想將該值添加到該特定日期的時間戳以爲每個條目創建完整的unix時間戳。

我知道,我可以通過先前行比較:

bars['Date'][:-1]>bars['Date'][1:] 

我覺得這將是要走的路,但我不能想出一個辦法,在函數中使用,因爲它返回一個系列。

在此先感謝您的幫助!

回答

1

您可以添加一個始終包含最新Timestamp的新列,然後根據需要添加到Date

threshold = 24000 
bars['Timestamp'] = bars[bars['Date']>threshold].loc[:, 'Date'] 
bars['Timestamp'] = bars['Timestamp'].fillna(method='ffill') 
bars['Date'] = bars.apply(lambda x: x.Date + x.Timestamp if x.Date < threshold else x.Date, axis=1) 
bars.drop('Timestamp', axis=1, inplace=True) 

得到:如果日期列是連續的

  Date Close  High  Low Open Volume 
0  1450449000 173.87 173.870 173.83 173.87 46987 
1  1450449060 173.61 173.830 173.55 173.78 19275 
2  1450449120 173.37 173.630 173.37 173.60 16014 
3  1450449180 173.50 173.590 173.31 173.34 14198 
4  1450449240 173.50 173.570 173.46 173.52 7010 
5  1450449300 173.66 173.680 173.44 173.45 10597 
6  1450449360 173.40 173.670 173.34 173.67 14270 
7  1450449420 173.36 173.360 173.13 173.32 22485 
8  1450449480 173.29 173.480 173.25 173.36 18542 
+0

這將是一個可以接受的解決方案。也許我的問題還不夠清楚。在大約(某些數據偶爾缺失)索引390'日期'列重新設置新的日期值,此時'時間戳'列將打印正確的值,但不會將'timestamp ='重置爲新的日期值所有後續行將不正確。我會修改我的問題來展示一個例子。 – Grr

+0

因爲我還是一個新手,所有這些我都有一個問題,試圖實現一個類似於你以前的答案。如果我是正確的,你就不能在lambda中賦值,就像'(lambda x:x + timestamp if x Grr

+0

查看更新的答案。 – Stefan

相關問題