如何在熊猫日期时间数据框中索引打开和关闭?

Posted

技术标签:

【中文标题】如何在熊猫日期时间数据框中索引打开和关闭?【英文标题】:How to index out open and close in pandas datetime dataframe? 【发布时间】:2021-04-08 15:09:41 【问题描述】:

好的,我有一个包含 2020 年标准普尔 500 指数分钟数据的 csv,我正在寻找如何仅索引 9:30 和 4:00 的收盘价和开盘价。本质上,我只想要市场开盘和收盘的情况。到目前为止的代码是:

import pandas as pd
import datetime as dt
import numpy as np

d = pd.read_csv('/Volumes/Seagate Portable/usindex_2020_all_tickers_awvbxk9/SPX_2020_2020.txt')
d.columns = ['Dates', 'Open', 'High', 'Low', 'Close']
d.drop(['High', 'Low'], axis=1, inplace=True)
d.set_index('Dates', inplace=True)

d.head() 

它不会让我共享 csv 文件,但这是输出的样子:

                    Open    Close
Dates       
2020-01-02 09:31:00 3247.19 3245.22
2020-01-02 09:32:00 3245.07 3244.66
2020-01-02 09:33:00 3244.89 3247.61
2020-01-02 09:34:00 3247.38 3246.92
2020-01-02 09:35:00 3246.89 3249.09

我尝试过使用 loc 和 dt.time,我认为这是正确的编码方式,我只是想不出准确的代码来索引这 2 次。有任何想法吗?谢谢!

【问题讨论】:

【参考方案1】: 如果.dt 提取器用于'Dates' 列(d.Dates.dt.time[0]),则.time 组件为datetime.time(9, 30),因此d.Dates.dt.time == dtime(9, 30) 必须用于Boolean 匹配,而不是@ 987654328@
import pandas as pd
from datetime import time as dtime

# test dataframe
d = pd.DataFrame('Dates': ['2020-01-02 09:30:00', '2020-01-02 09:31:00', '2020-01-02 09:32:00', '2020-01-02 09:33:00', '2020-01-02 09:34:00', '2020-01-02 09:35:00', '2020-01-02 16:00:00'], 'Open': [3247.19, 3247.19, 3245.07, 3244.89, 3247.38, 3246.89, 3247.19], 'Close': [3245.22, 3245.22, 3244.66, 3247.61, 3246.92, 3249.09, 3245.22])

# display(d)
                 Dates     Open    Close
0  2020-01-02 09:30:00  3247.19  3245.22
1  2020-01-02 09:31:00  3247.19  3245.22
2  2020-01-02 09:32:00  3245.07  3244.66
3  2020-01-02 09:33:00  3244.89  3247.61
4  2020-01-02 09:34:00  3247.38  3246.92
5  2020-01-02 09:35:00  3246.89  3249.09
6  2020-01-02 16:00:00  3247.19  3245.22

# verify Dates is a datetime format
d.Dates = pd.to_datetime(d.Dates)

# use Boolean selection for 9:30 and 16:00 (4pm)
d = d[(d.Dates.dt.time == dtime(9, 30)) | (d.Dates.dt.time == dtime(16, 0))].copy()

# set the index
d.set_index('Dates', inplace=True)

# display(d)
                        Open    Close
Dates                                
2020-01-02 09:30:00  3247.19  3245.22
2020-01-02 16:00:00  3247.19  3245.22

【讨论】:

非常感谢!这工作。老实说,虽然我的问题是使用 OR 而不是 |,但我尝试了这个确切的代码,再次感谢您。 @benito.cano 不客气。新年快乐! 谢谢你也祝你新年快乐!【参考方案2】:

试试:

import pandas as pd

# create dummy daterange
date_range = pd.DatetimeIndex(pd.date_range("00:00", "23:59", freq='1min'))

# create df with enumerated column as data, and with daterange(DatetimeIndex) as index
df = pd.DataFrame(data=[i for i, d in enumerate(date_range)], index=date_range)

# boolean index using strings
four_and_nine = df[(df.index == '16:00:00') | (df.index == '21:00:00')]

print(four_and_nine)

                        0
2021-01-01 16:00:00   960
2021-01-01 21:00:00  1260

Pandas 非常聪明地将字符串与实际日期时间(在本例中为 DatetimeIndex)进行比较。

上面是选择小时的顶部。如果您想要特定小时内的所有分钟/秒,请使用布尔索引,例如:df[(df.index.hour == 4) | (df.index.hour == 9)]

【讨论】:

为我工作。复制/粘贴我的虚拟代码(更新) 似乎如果时间序列是使用pd.date_range 创建的,那么== '16:00:00' 可以作为Boolean 选择。但是,如果 Dates 列是按照我的示例中所示创建的,或者它是从 csv 导入的,并且 Dates 列被转换为 datetime dtype,则 == datetime.time(16, 0) 有效,而 == '16:00:00' 无效。我不清楚,为什么会这样。

以上是关于如何在熊猫日期时间数据框中索引打开和关闭?的主要内容,如果未能解决你的问题,请参考以下文章

从熊猫数据框中的日期时间中删除时间戳

无法在熊猫数据框中按时间戳索引

填补熊猫数据框中的日期空白

如何使用熊猫更改数据框中的日期时间格式? [复制]

如何在日期时间索引和两列上合并熊猫数据框

从熊猫数据框中获取最小和最大日期