Pandas Dataframe - 从 20 年的历史数据中删除一天中的某些小时

HML*_*ude 9 python numpy dataframe pandas

我有 20 年前单一证券的股票市场数据。数据当前位于 Pandas DataFrame 中,格式如下:

在此处输入图片说明

问题是,我不希望我的 DataFrame 中有任何“下班后”交易数据。相关市场的开放时间为上午 9:30 至下午 4 点(每个交易日的 09:30 至 16:00)。我想删除不在此时间范围内的所有数据行。

我的直觉是使用 Pandas 面具,如果我想要一天中的某些小时,我知道该怎么做:

mask = (df['date'] > '2015-07-06 09:30:0') & (df['date'] <= '2015-07-06 16:00:0')
sub = df.loc[mask]
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何使用一个循环来删除 20 年期间一天中某些时间的数据。

Bha*_*ara 9

这里的问题是您如何导入数据。没有指示 04:00 是上午还是下午?但根据您的评论,我们需要假设它是 PM。但是输入显示为 AM。

为了解决这个问题,我们需要在 OR 子句中包含两个条件。

  1. 9:30-11:59
  2. 0:00-4:00

输入:

df = pd.DataFrame({'date':   {880551: '2015-07-06 04:00:00', 880552: '2015-07-06 04:02:00',880553: '2015-07-06 04:03:00', 880554: '2015-07-06 04:04:00', 880555: '2015-07-06 04:05:00'},
                   'open':   {880551: 125.00, 880552: 125.36,880553: 125.34, 880554: 125.08, 880555: 125.12},
                   'high':   {880551: 125.00, 880552: 125.36,880553: 125.34, 880554: 125.11, 880555: 125.12},
                   'low':    {880551: 125.00, 880552: 125.32,880553: 125.21, 880554: 125.05, 880555: 125.12},
                   'close':  {880551: 125.00, 880552: 125.32,880553: 125.21, 880554: 125.05, 880555: 125.12},
                   'volume': {880551: 141, 880552: 200,880553: 750, 880554: 17451, 880555: 1000},
                   },
                   )


df.head()

    date    open    high    low close   volume
880551  2015-07-06 04:00:00 125.00  125.00  125.00  125.00  141
880552  2015-07-06 04:02:00 125.36  125.36  125.32  125.32  200
880553  2015-07-06 04:03:00 125.34  125.34  125.21  125.21  750
880554  2015-07-06 04:04:00 125.08  125.11  125.05  125.05  17451
880555  2015-07-06 04:05:00 125.12  125.12  125.12  125.12  1000

from datetime import time

start_first = time(9, 30)
end_first = time(11, 59)
start_second = time(0, 00)
end_second = time(4,00)
df['date'] = pd.to_datetime(df['date'])
df= df[(df['date'].dt.time.between(start_first, end_first)) | (df['date'].dt.time.between(start_second, end_second))]
df
date    open    high    low close   volume
880551  2015-07-06 04:00:00 125.0   125.0   125.0   125.0   141
Run Code Online (Sandbox Code Playgroud)

以上不是好的做法,我强烈不鼓励使用这种含糊不清的数据。长时间的解决方案是使用 am/pm 正确填充数据。

在数据格式正确的情况下,我们可以通过两种方式实现:

1)使用日期时间

from datetime import time

start = time(9, 30)
end = time(16)
df['date'] = pd.to_datetime(df['date'])
df= df[df['date'].dt.time.between(start, end)]
Run Code Online (Sandbox Code Playgroud)

2)在时间之间使用,仅适用于日期时间索引

df['date'] = pd.to_datetime(df['date'])

df = (df.set_index('date')
          .between_time('09:30', '16:00')
          .reset_index())
Run Code Online (Sandbox Code Playgroud)

如果您仍然遇到错误,请使用逐行方法和精确错误编辑您的问题。


jor*_*mit 6

我认为答案已经在评论中(@Parfait 的. Between_time),但它在调试问题中丢失了。您的专栏似乎还df['date']没有类型Datetime

这应该足以解决这个问题并获得所需的结果:

df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
df = df.between_time('9:30', '16:00')
Run Code Online (Sandbox Code Playgroud)