2016-08-21 72 views
0

我在寻找基于在开始时间和ENDCOLUMN值有一个“扩”的日期范围。熊猫累计时间序列范围数据帧

如果在之前的纪录出现创纪录的任何部分,我想回到一个开始时间是两个开始时间记录的最小和结束时间是最大的两个结束时间记录。

这些将通过订单ID

Order starttime    endtime     RollingStart   RollingEnd 
1 2015-07-01 10:24:43.047 2015-07-01 10:24:43.150 2015-07-01 10:24:43.047 2015-07-01 10:24:43.150 
1 2015-07-01 10:24:43.137 2015-07-01 10:24:43.200 2015-07-01 10:24:43.047 2015-07-01 10:24:43.200 
1 2015-07-01 10:24:43.197 2015-07-01 10:24:57.257 2015-07-01 10:24:43.047 2015-07-01 10:24:57.257 
1 2015-07-01 10:24:57.465 2015-07-01 10:25:13.470 2015-07-01 10:24:57.465 2015-07-01 10:25:13.470 
1 2015-07-01 10:24:57.730 2015-07-01 10:25:13.485 2015-07-01 10:24:57.465 2015-07-01 10:25:13.485 
2 2015-07-01 10:48:57.465 2015-07-01 10:48:13.485 2015-07-01 10:48:57.465 2015-07-01 10:48:13.485 

所以进行分组,在上述例子中,订单1具有运行从2015年7月1日10的初始范围:24:43.047到2015-07- 01 10:24:57.257然后另一个从2015-07-01 10:24:57.465到2015-07-01 10:25:13.485

请注意,虽然开始时间有序,但结束时间不一定由于数据的性质(有短期的事件和长期事件)

最后,我只想每个订单ID的最后一个记录,滚动发车组合(所以在这种情况下,最后两个记录

我试图

df['RollingStart'] = np.where((df['endtime'] >= df['RollingStart'].shift()) & (df['RollingEnd'].shift()>= df['starttime']), min(df['starttime'],df['RollingStart']),df['starttime']) 

(这显然不包括订单id)

但错误我收到是

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

任何想法,将不胜感激

代码复制如下:

from io import StringIO 
import io 

text = """Order starttime    endtime 
1  2015-07-01 10:24:43.047 2015-07-01 10:24:43.150 
1  2015-07-01 10:24:43.137 2015-07-01 10:24:43.200 
1  2015-07-01 10:24:43.197 2015-07-01 10:24:57.257 
1  2015-07-01 10:24:57.465 2015-07-01 10:25:13.470 
1  2015-07-01 10:24:57.730 2015-07-01 10:25:13.485 
2  2015-07-01 10:48:57.465 2015-07-01 10:48:13.485""" 

df = pd.read_csv(StringIO(text), sep='\s{2,}', engine='python', parse_dates=[1, 2]) 
df['RollingStart'] = np.where((df['endtime'] >= df['RollingStart'].shift()) & (df['RollingEnd'].shift()>= df['start']), min(df['starttime'],df['RollingStart']),df['starttime']) 




df = pd.read_csv(StringIO(text), sep='\s{2,}', engine='python', parse_dates=[1, 2]) 


df['RollingStart']=df['starttime'] 
df['RollingEnd']=df['endtime'] 
df['RollingStart'] = 
np.where((df['endtime'] >= df['RollingStart'].shift()) & (df['RollingEnd'].shift()>= df['starttime']),min(df['starttime'],df['RollingStart']),df['starttime']) 

错误是:

Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    File "C:\Anaconda3\lib\site-packages\pandas\core\generic.py", line 731, in  __nonzero__ 
.format(self.__class__.__name__)) 
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

感谢

回答

1

它看起来像你试图返回基于对尚未设定值的值,

df['start'] =...conditions... df['start'].shift()

对我来说就像你试图设置一个条件o Pandas对此一无所知。

如果您只是试图将“开始”值设置为这些列中的最新时间,请尝试使用或语句构建语句,或者使用临时数组并使用max,如果您只是试图获取最新的时间

df['start'] = np.where(max(df['enddatetime'],df['startdatetime'],))

如果上述偏了,你有没有代码重现此DF所以我可以看到,如果我得到同样的错误?

+0

我试图让最早开始时间(然后我会尝试获得最新的结束时间),每个重叠系列..不知道我跟你提出什么,我的道歉 –

+1

完整的代码重现内联更新 - 谢谢 –

0

试试这个:

版本1

NaT = pd.NaT 
df['Rolling2']  = np.where(df['starttime'].shift(-1) > df['endtime'], NaT,'drop') 
df['Rolling2']  = df['Rolling2'].shift(1) 
df['RollingStart'] = np.where(df['Rolling2'] =='drop',None,df['starttime']) 
df['RollingStart'] = pd.to_datetime(df['RollingStart']).ffill() 
df['RollingEnd'] = df['endtime'] 
del df['Rolling2'] 

第2版。

df['RollingStart'] = df['starttime'] 
df['RollingEnd'] = df['endtime'] 
df['RollingStart'] = np.where(df['RollingEnd'].shift()>= df['starttime'] ,pd.NaT , df['RollingStart']) 
df['RollingStart'] = pd.to_datetime(df['RollingStart']).ffill() 


    Order    starttime     endtime   RollingStart    RollingEnd 
0  1 2015-07-01 10:24:43.047 2015-07-01 10:24:43.150 2015-07-01 10:24:43.047 2015-07-01 10:24:43.150 
1  1 2015-07-01 10:24:43.137 2015-07-01 10:24:43.200 2015-07-01 10:24:43.047 2015-07-01 10:24:43.200 
2  1 2015-07-01 10:24:43.197 2015-07-01 10:24:57.257 2015-07-01 10:24:43.047 2015-07-01 10:24:57.257 
3  1 2015-07-01 10:24:57.465 2015-07-01 10:25:13.470 2015-07-01 10:24:57.465 2015-07-01 10:25:13.470 
4  1 2015-07-01 10:24:57.730 2015-07-01 10:25:13.485 2015-07-01 10:24:57.465 2015-07-01 10:25:13.485 
5  2 2015-07-01 10:48:57.465 2015-07-01 10:48:13.485 2015-07-01 10:48:57.465 2015-07-01 10:48:13.485 
+0

我给了你两个解决方案..哪一个你指的是你。 – Merlin

+0

我不能为我的生活弄清楚如何让rollingend使用这个逻辑,因为结束时间可能会发生不同步..真的很感谢您可以提供任何帮助..谢谢 –