如何在熊猫日期时间数据框中索引打开和关闭?
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'
无效。我不清楚,为什么会这样。以上是关于如何在熊猫日期时间数据框中索引打开和关闭?的主要内容,如果未能解决你的问题,请参考以下文章