23

My Pandas Dataframe frame looks something like this

 1. 2013-10-09 09:00:05
 2. 2013-10-09 09:05:00
 3. 2013-10-09 10:00:00
 4.  ............
 5.   ............
 6.   ............
 7. 2013-10-10 09:00:05
 8. 2013-10-10 09:05:00 
 9. 2013-10-10 10:00:00

I want the data lying in between hours 9 and 10 ...if anyone has worked on something like this ,it would be really helpful.

4 Answers 4

41
 In [7]: index = date_range('20131009 08:30','20131010 10:05',freq='5T')

In [8]: df = DataFrame(randn(len(index),2),columns=list('AB'),index=index)

In [9]: df
Out[9]: 
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 308 entries, 2013-10-09 08:30:00 to 2013-10-10 10:05:00
Freq: 5T
Data columns (total 2 columns):
A    308  non-null values
B    308  non-null values
dtypes: float64(2)

In [10]: df.between_time('9:00','10:00')
Out[10]: 
                            A         B
2013-10-09 09:00:00 -0.664639  1.597453
2013-10-09 09:05:00  1.197290 -0.500621
2013-10-09 09:10:00  1.470186 -0.963553
2013-10-09 09:15:00  0.181314 -0.242415
2013-10-09 09:20:00  0.969427 -1.156609
2013-10-09 09:25:00  0.261473  0.413926
2013-10-09 09:30:00 -0.003698  0.054953
2013-10-09 09:35:00  0.418147 -0.417291
2013-10-09 09:40:00  0.413565 -1.096234
2013-10-09 09:45:00  0.460293  1.200277
2013-10-09 09:50:00 -0.702444 -0.041597
2013-10-09 09:55:00  0.548385 -0.832382
2013-10-09 10:00:00 -0.526582  0.758378
2013-10-10 09:00:00  0.926738  0.178204
2013-10-10 09:05:00 -1.178534  0.184205
2013-10-10 09:10:00  1.408258  0.948526
2013-10-10 09:15:00  0.523318  0.327390
2013-10-10 09:20:00 -0.193174  0.863294
2013-10-10 09:25:00  1.355610 -2.160864
2013-10-10 09:30:00  1.930622  0.174683
2013-10-10 09:35:00  0.273551  0.870682
2013-10-10 09:40:00  0.974756 -0.327763
2013-10-10 09:45:00  1.808285  0.080267
2013-10-10 09:50:00  0.842119  0.368689
2013-10-10 09:55:00  1.065585  0.802003
2013-10-10 10:00:00 -0.324894  0.781885
Sign up to request clarification or add additional context in comments.

4 Comments

This is exactly what I was looking for, there are many other solutions on SO that do not seem to mention this simple built in way.
between_time() is a newer feature
between_time was added on 0.9.1; which was 3 major releases ago
@Jeff how would the script change if one intended to keep the data included the date range and set everything outside the range to 0 in order to allow plotting without changing the datetime index?
2

Make a new column for the time after splitting your original column . Use the below code to split your time for hours, minutes, and seconds:-

df[['h','m','s']] = df['Time'].astype(str).str.split(':', expand=True).astype(int)

Once you are done with that, you have to select the data by filtering it out:-

df9to10 =df[df['h'].between(9, 10, inclusive=True)]

And, it's dynamic, if you want to take another period between apart from 9 and 10.

Comments

1

Another method that uses query. Tested with Python 3.9.

from Pandas import Timestamp
from datetime import time
df = pd.DataFrame({"timestamp": 
[Timestamp("2017-01-03 09:30:00.049"), Timestamp("2017-01-03 09:30:00.049"),
 Timestamp("2017-12-29 16:12:34.214"), Timestamp("2017-12-29 16:17:19.006")]})
df["time"] = df.timestamp.dt.time
start_time = time(9,20,0)
end_time = time(10,0,0)
df_times = df.query("time >= @start_time and time <= @end_time")

In:

              timestamp
2017-01-03 09:30:00.049
2017-01-03 09:30:00.049
2017-12-29 16:12:34.214
2017-12-29 16:17:19.006

Out:

              timestamp             time
2017-01-03 09:30:00.049  09:30:00.049000
2017-01-03 09:30:00.049  09:30:00.049000

As a bonus, arbitrarily complex expressions can be used within a query, e.g. selecting everything within two separate time ranges (this is impossible with between_time).

1 Comment

You can also write: df_times = df.query("@start_time <= time <= @end_time")
-1

Assuming your original dataframe is called "df" and your time column is called "time" this would work: (where start_time and end_time correspond to the time interval that you'd like)

>>> df_new = df[(df['time'] > start_time) & (df['time'] < end_time)]

Comments

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.