2016-08-14 45 views
0

我正在試圖使用between_time找到兩點之間的值min()。我已經創建了兩個欄,我想爲我的開始使用和結束的時間來尋找最小值和輸出添加到新列:熊貓時間戳 - 無法將參數轉換爲時間錯誤

這是DF的剪斷:

df[['Date_Time','d1_idx_last','Low']] 



            Date_Time d1_idx_last    Low 
Timestamp   
2015-09-01 09:30:00.000 2015-09-01 09:30:00.000 2015-09-01 16:14:51.000 1887.750 
2015-09-01 09:30:01.000 2015-09-01 09:30:01.000 2015-09-01 16:14:51.000 1888.250 
2015-09-01 09:30:01.200 2015-09-01 09:30:01.200 2015-09-01 16:14:51.000 1888.000 
2015-09-01 09:30:10.100 2015-09-01 09:30:10.100 2015-09-01 16:14:51.000 1889.250 
2015-09-01 09:30:11.100 2015-09-01 09:30:11.100 2015-09-01 16:14:51.000 1889.500 

我想使用此代碼:

df.Low.between_time(df.Date_Time, df.d1_idx_last, include_start=True, include_end=True) 

,並得到這個錯誤:

Cannot convert arg [1441099800000000000 1441099801000000000 1441099801200000000 ..., 
1470924200100000000 1470924369230000000 1470924793157000000] to a time 

'Date_Time' & 'd1_idx_last'都是pandas.tslib.Timestamp

更新澄清:

因此,如果我們看第一行就說明

'Date_Time' 2015-09-01 09:30:00.000 'd1_idx_last'2015-09-01 16:14:51.000

在此列'Date_Time' & 'd1_idx_last'之間的時間捕獲一個完整的交易日( 09:30-16:15),我希望這兩點之間的時間很短。

在這一天市場低至1863.500,因此這將是(09:30-16:15)的最小值。

df[['Low']]['2015-09-01'].min() 

Low 1863.500 
dtype: float64 

如果1863.500的低點在13:00點出現,此點之後的滾動低點將會更高。

我想一個名爲df['subset_low']新列上每行檢查'Date_Time' & 'd1_idx_last',發現這一時期的低,增加了它的df,[「subset_low」]。它正在檢查當前時間和當天的最後一點,並顯示此時間之間的低點。

使用@Maxu假數據在Low和(期望的)subset_low列又如: enter image description here

+1

你需要傳遞'between_time'標值 - 不是一個系列的對象...... –

+0

我會做到這一點通過使用'apply'在每行的基礎上實現?任何人都可以幫助修復我的代碼嗎? – ade1e

回答

2

UPDATE:使用難看方法 - apply(..., axis=1)

In [170]: df['subset_low'] = df.apply(lambda r: df.query('@r.Date_Time <= index <= @r.d1_idx_last').Low.min(), axis=1) 

In [171]: df 
Out[171]: 
             Date_Time   d1_idx_last Low subset_low 
idx 
2015-09-01 09:30:00.000 2015-09-01 09:30:00.000 2015-09-01 16:14:51 2   1 
2015-09-01 09:30:01.000 2015-09-01 09:30:01.000 2015-09-01 16:14:51 1   1 
2015-09-01 09:30:01.200 2015-09-01 09:30:01.200 2015-09-01 16:14:51 3   3 
2015-09-01 09:30:10.100 2015-09-01 09:30:10.100 2015-09-01 16:14:51 4   3 
2015-09-01 09:30:11.100 2015-09-01 09:30:11.100 2015-09-01 16:14:51 3   3 

OLD答案:

as @JonClements已經saidbetween_time()方法需要前兩個參數的標量值 - (start_time,end_time),並且它只檢查時間部分。

演示:

In [72]: df.between_time('09:30:10','09:30:15') 
Out[72]: 
             Date_Time   d1_idx_last  Low 
idx 
2015-09-01 09:30:10.100 2015-09-01 09:30:10.100 2015-09-01 16:14:51 1889.25 
2015-09-01 09:30:11.100 2015-09-01 09:30:11.100 2015-09-01 16:14:51 1889.50 

您可以使用query()方法,而不是

In [70]: df.query('Date_Time <= index <= d1_idx_last') 
Out[70]: 
             Date_Time   d1_idx_last  Low 
idx 
2015-09-01 09:30:00.000 2015-09-01 09:30:00.000 2015-09-01 16:14:51 1887.75 
2015-09-01 09:30:01.000 2015-09-01 09:30:01.000 2015-09-01 16:14:51 1888.25 
2015-09-01 09:30:01.200 2015-09-01 09:30:01.200 2015-09-01 16:14:51 1888.00 
2015-09-01 09:30:10.100 2015-09-01 09:30:10.100 2015-09-01 16:14:51 1889.25 
2015-09-01 09:30:11.100 2015-09-01 09:30:11.100 2015-09-01 16:14:51 1889.50 

我如何獲得的df.Lowmin()Date_Timed1_idx_last之間使用df.query

In [74]: df.query('Date_Time <= index <= d1_idx_last').Low.min() 
Out[74]: 1887.75 
+0

感謝Maxu,但是如何使用'df.query'獲得'Date_Time'和'd1_idx_last'之間的'df.Low'的min()'?你的代碼的輸出沒有給出這個。 – ade1e

+0

@adele,我已經更新了我的答案 - 是你想要的嗎? – MaxU

+0

該df有148566行,我想添加一個新列,在每個行的'Date_Time'和'd1_idx_last'之間顯示'df.Low'的min()值。我將在稍後使用這一新列進一步分析。我是否需要使用'apply'或'map'來做到這一點?如果我使用代碼,它會給我一個值,而不是查看每一行。感謝您的幫助 – ade1e