目前,我有一个带有这行代码的数据框,它为我提供了日期和时间,如下所示:
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
要创建Date
和Time
列,请将Date
设置为索引,并将Time
设置为第一列。
答案 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
(即与str
或O
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