9:30-16:00的pandas / python date_range收缩

时间:2018-07-23 15:27:36

标签: python pandas datetime

目前,我有一个带有这行代码的数据框,它为我提供了日期和时间,如下所示:

ts = pd.date_range(start=pd.to_datetime(startDate,format='%m-%d-%Yt%H:%M:%S'),periods=len(df),freq='1min')

这将以分钟为间隔给出数据框的日期范围,并在24小时时间范围内运行。我想知道如何限制9:30-16:00(9:30 AM-4:00PM)的时间范围,然后在达到4:00 PM时移至第二天。我现在的数据框:

df = 

                Time   Open   High    Low  Close  Volume
Date
2018-03-20  09:30:00  93.05  93.32  93.01  93.12  524939
2018-03-20  09:31:00  93.68  93.69  93.53  93.54   77138
2018-03-20  09:32:00  92.82  92.90  92.82  92.88   43388
...              ...    ...    ...    ...    ...     ...
2018-03-20  15:56:00  93.65  93.71  93.64  93.69   44175
2018-03-20  15:57:00  93.12  93.29  93.00  93.27  166822
2018-03-20  15:58:00  93.28  93.36  93.27  93.33   70954
2018-03-20  15:59:00  93.33  93.43  93.30  93.34   94118
2018-03-20  16:00:00  93.34  93.53  93.34  93.44   75326
2018-03-20  16:01:00  93.43  93.45  93.30  93.30   53790

,我希望以下数据框成为我的结果

updated_df =

                Time   Open   High    Low  Close  Volume
Date
2018-03-20  09:30:00  93.05  93.32  93.01  93.12  524939
2018-03-20  09:31:00  93.68  93.69  93.53  93.54   77138
2018-03-20  09:32:00  92.82  92.90  92.82  92.88   43388
...              ...    ...    ...    ...    ...     ...
2018-03-20  15:56:00  93.65  93.71  93.64  93.69   44175
2018-03-20  15:57:00  93.12  93.29  93.00  93.27  166822
2018-03-20  15:58:00  93.28  93.36  93.27  93.33   70954
2018-03-20  15:59:00  93.33  93.43  93.30  93.34   94118
2018-03-20  16:00:00  93.34  93.53  93.34  93.44   75326
2018-03-21  09:30:00  93.43  93.45  93.30  93.30   53790

我用过

df['Date'] = ts.date
df['Time'] = ts.time

要创建DateTime列,请将Date设置为索引,并将Time设置为第一列。

3 个答案:

答案 0 :(得分:4)

只需使用简单的切片

t = pd.to_datetime(df.Time)
df[(t >= '09:30:00') &  (t <= '16:00:00')]

    Date        Time        Open    High    Low     Close   Volume
0   2018-03-20  09:30:00    93.05   93.32   93.01   93.12   524939
1   2018-03-20  09:31:00    93.68   93.69   93.53   93.54   77138
2   2018-03-20  09:32:00    92.82   92.90   92.82   92.88   43388
3   2018-03-20  15:56:00    93.65   93.71   93.64   93.69   44175
4   2018-03-20  15:57:00    93.12   93.29   93.00   93.27   166822
5   2018-03-20  15:58:00    93.28   93.36   93.27   93.33   70954
6   2018-03-20  15:59:00    93.33   93.43   93.30   93.34   94118
7   2018-03-20  16:00:00    93.34   93.53   93.34   93.44   75326

答案 1 :(得分:1)

这是使用datetime.time的一种方法:

import datetime

df = pd.DataFrame(index=range(100))

ts = pd.date_range(start=pd.to_datetime('now'), periods=len(df), freq='1min')

min_time = datetime.time(9, 30, 0)
max_time = datetime.time(16, 0, 0)

res = ts[(min_time <= ts.time) & (ts.time <= max_time)]

print(res)

DatetimeIndex(['2018-07-23 15:39:34', '2018-07-23 15:40:34',
               '2018-07-23 15:41:34', '2018-07-23 15:42:34',
               '2018-07-23 15:43:34', '2018-07-23 15:44:34',
               '2018-07-23 15:45:34', '2018-07-23 15:46:34',
               '2018-07-23 15:47:34', '2018-07-23 15:48:34',
               '2018-07-23 15:49:34', '2018-07-23 15:50:34',
               '2018-07-23 15:51:34', '2018-07-23 15:52:34',
               '2018-07-23 15:53:34', '2018-07-23 15:54:34',
               '2018-07-23 15:55:34', '2018-07-23 15:56:34',
               '2018-07-23 15:57:34', '2018-07-23 15:58:34',
               '2018-07-23 15:59:34'],
              dtype='datetime64[ns]', freq='T')

答案 2 :(得分:1)

这是使用简单索引的另一种方式,但也使用.between来简化。即使您的Time列不是dtype datetime(即与strO dtypes一起使用也仍然有效):

df.loc[df.Time.between('09:30:00', '16:00:00')]

                Time   Open   High    Low  Close  Volume
Date                                                    
2018-03-20  09:30:00  93.05  93.32  93.01  93.12  524939
2018-03-20  09:31:00  93.68  93.69  93.53  93.54   77138
2018-03-20  09:32:00  92.82  92.90  92.82  92.88   43388
2018-03-20  15:56:00  93.65  93.71  93.64  93.69   44175
2018-03-20  15:57:00  93.12  93.29  93.00  93.27  166822
2018-03-20  15:58:00  93.28  93.36  93.27  93.33   70954
2018-03-20  15:59:00  93.33  93.43  93.30  93.34   94118
2018-03-20  16:00:00  93.34  93.53  93.34  93.44   75326