2014-03-27 23 views
2

我有加載像這樣選擇數據框片

 minData = pd.read_csv(
       currentSymbol["fullpath"], 
       header = None, 
       names = ['Date', 'Time', 'Open', 'High', 'Low', 'Close', 'Volume', 'Split Factor', 'Earnings', 'Dividends'], 
       parse_dates = [["Date", "Time"]], 
       date_parser = lambda x : datetime.datetime.strptime(x, '%Y%m%d %H%M'), 
       index_col = "Date_Time", 
       sep=' ') 

的數據看起來像一個數據幀這

>>> minData.index 
<class 'pandas.tseries.index.DatetimeIndex'> 
[1998-01-02 09:30:00, ..., 2013-12-09 16:00:00] 
Length: 1373036, Freq: None, Timezone: None 
>>> 

>>> minData.head(5) 
         Open  High  Low Close Volume \ 
Date_Time               
1998-01-02 09:30:00 8.70630 8.70630 8.70630 8.70630 420.73 
1998-01-02 09:35:00 8.82514 8.82514 8.82514 8.82514 420.73 
1998-01-02 09:42:00 8.79424 8.79424 8.79424 8.79424 420.73 
1998-01-02 09:43:00 8.76572 8.76572 8.76572 8.76572 1262.19 
1998-01-02 09:44:00 8.76572 8.76572 8.76572 8.76572 420.73 

        Split Factor Earnings Dividends Active 
Date_Time              
1998-01-02 09:30:00    4   0   0  NaN 
1998-01-02 09:35:00    4   0   0  NaN 
1998-01-02 09:42:00    4   0   0  NaN 
1998-01-02 09:43:00    4   0   0  NaN 
1998-01-02 09:44:00    4   0   0  NaN 

[5 rows x 9 columns] 

我可以選擇這樣的

>>> minData["2004-12-20"] 
         Open  High  Low Close  Volume \ 
Date_Time                
2004-12-20 09:30:00 35.8574 35.9373 35.8025 35.9273 154112.00 
2004-12-20 09:31:00 35.8924 35.9174 35.8824 35.8874 17021.50 
2004-12-20 09:32:00 35.8874 35.8924 35.8824 35.8824 17079.50 
2004-12-20 09:33:00 35.8874 35.9423 35.8724 35.9373 32491.50 
2004-12-20 09:34:00 35.9373 36.0023 35.9174 36.0023 40096.40 
2004-12-20 09:35:00 35.9923 36.2071 35.9923 36.1471 67088.90 
... 
從我的數據幀的行

我有看起來像這樣的日期(從不同的文件中讀取)

>>> ts 
Timestamp('2004-12-20 00:00:00', tz=None) 
>>> 

我想在這一天的所有分鐘中將「活動」列設置爲「真」。

我可以用這個

minData.loc['2004-12-20',"Active"] = True 

做到這一點,我可以做我的時間戳日期同樣的事情這個瘋狂的一段代碼

minData.loc[str(ts.year) + "-" + str(ts.month) + "-" + str(ts.day),"Active"] = True 

是的,這就是創建一個從時間戳的字符串目的!

我知道必須有一個更好的方式來做到這一點..

回答

5

我會做這其實

In [20]: df = DataFrame(np.random.randn(10,1),index=date_range('20130101 23:55:00',periods=10,freq='T')) 

In [21]: df['Active'] = False 

In [22]: df 
Out[22]: 
          0 Active 
2013-01-01 23:55:00 0.273194 False 
2013-01-01 23:56:00 2.869795 False 
2013-01-01 23:57:00 0.980566 False 
2013-01-01 23:58:00 0.176711 False 
2013-01-01 23:59:00 -0.354976 False 
2013-01-02 00:00:00 0.258194 False 
2013-01-02 00:01:00 -1.765781 False 
2013-01-02 00:02:00 0.106163 False 
2013-01-02 00:03:00 -1.169214 False 
2013-01-02 00:04:00 0.224484 False 

[10 rows x 2 columns] 


In [28]: df['Active'] = False 

由於@Andy海登指出,normalize的時間設置爲0,這樣就可以直接比較時間戳爲0的時間戳。

In [34]: df.loc[df.index.normalize() == Timestamp('20130102'),'Active'] = True 

In [35]: df 
Out[35]: 
          0 Active 
2013-01-01 23:55:00 0.273194 False 
2013-01-01 23:56:00 2.869795 False 
2013-01-01 23:57:00 0.980566 False 
2013-01-01 23:58:00 0.176711 False 
2013-01-01 23:59:00 -0.354976 False 
2013-01-02 00:00:00 0.258194 True 
2013-01-02 00:01:00 -1.765781 True 
2013-01-02 00:02:00 0.106163 True 
2013-01-02 00:03:00 -1.169214 True 
2013-01-02 00:04:00 0.224484 True 

[10 rows x 2 columns] 

對於真正的精細控制,做到這一點(和你可以使用indexer_at_time如果只想作爲索引)。並且您始終可以使用子句來執行更復雜的索引。

In [29]: df.loc[df.index.indexer_between_time('20130101 23:59:00','20130102 00:03:00'),'Active'] = True 

In [30]: df 
Out[30]: 
          0 Active 
2013-01-01 23:55:00 0.273194 False 
2013-01-01 23:56:00 2.869795 False 
2013-01-01 23:57:00 0.980566 False 
2013-01-01 23:58:00 0.176711 False 
2013-01-01 23:59:00 -0.354976 True 
2013-01-02 00:00:00 0.258194 True 
2013-01-02 00:01:00 -1.765781 True 
2013-01-02 00:02:00 0.106163 True 
2013-01-02 00:03:00 -1.169214 True 
2013-01-02 00:04:00 0.224484 False 

[10 rows x 2 columns] 
+0

是的,忘了那個!更新 – Jeff

+0

太棒了,謝謝@Jeff!我正在閱讀有關正常化的內容,但在這種情況下無法看到如何使用它。我沒有讀過關於indexer_between_time方法的任何內容。我會做一些研究。再次感謝 ! – JasonEdinburgh