2016-08-14 156 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