3

I am trying to find in a csv of a price chart the price values at a given period of time. I have converted the Datetime column into datetime data with the pd.to_datetime function, however I can not seem to find a method that allows me to filter the rows by separate dates hours and minutes. A typical row looks something like this.

Datetime        2021-10-15 19:55:00-04:00
Open                                40.15
High                                 40.2
Low                                 40.14
Close                               40.15
Volume                                  0
Dividends                               0
Stock Splits                            0
Name: 939, dtype: object
Empty DataFrame
Columns: [Datetime, Open, High, Low, Close, Volume, Dividends, Stock Splits]
Index: []

So far here is my code

import pandas as pd

data = pd.read_csv("Data\\09-16-21 AMC-5min", parse_dates=["Datetime"])

data["Datetime"] = pd.to_datetime(data['Datetime'])

newData = data[(data.Datetime.day == data.Datetime.day.max()) & data.Datetime.hour == 9 & data.Datetime.minute == 30]

print(newData)

in this example I am trying to find the data point on 9:30 of the most recent day. When I try to run this I get the following error

Traceback (most recent call last):
  File "C:\Users\Zach\PycharmProjects\Algotrading\Test.py", line 7, in <module>
    newData = data[(data.Datetime.day == data.Datetime.day.max()) & data.Datetime.hour == 9 & data.Datetime.minute == 30]
  File "C:\Users\Zach\PycharmProjects\Algotrading\venv\lib\site-packages\pandas\core\generic.py", line 5487, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'Series' object has no attribute 'day'

I'm not sure how to access the separate values for day, hour, and minutes. Any advice would be appreciated

1 Answer 1

3

You need .dt accessor with () for second and third condition:

newData = data[(data.Datetime.dt.day == data.Datetime.dt.day.max()) & 
               (data.Datetime.dt.hour == 9) & 
               (data.Datetime.dt.minute == 30)]

For converting to days only once:

s = data.Datetime.dt.day
newData = data[(s == s.max()) & 
               (data.Datetime.dt.hour == 9) & 
               (data.Datetime.dt.minute == 30)]
Sign up to request clarification or add additional context in comments.

1 Comment

That fixed it, Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.