2012-11-04 2 views
1

나는이처럼 보이는 dataframe있을 경우에만 시간을 기준으로 팬더 dataframe 내에서 행을 선택하는 방법 :지수는 날짜와 시간

<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 2016910 entries, 2009-01-02 04:51:00 to 2012-11-02 20:00:00 
Freq: T 
Data columns: 
X1 2016910 non-null values 
X2 2016910 non-null values 
X3 2016910 non-null values 
X4 2016910 non-null values 
X5 2016910 non-null values 
dtypes: float64(5) 

하고 싶습니다가 "필터"를 특정 액세스하여 시간의 전체 범위에 걸쳐. 예를 들어, 시간이 13:00:00에서 14:00:00 사이 인 모든 행을 포함하지만 모든 날짜를 포함하는 데이터 프레임을 반환하고 싶습니다. CSV 파일에서 데이터를 읽고 있는데 datetime은 하나의 열이지만 입력 CSV 파일에 별도의 날짜와 시간을 쉽게 포함시킬 수 있습니다. 나는 별도의 날짜와 시간 경로를 시도하고 멀티 인덱스를 만들었지 만, 내가했을 때, 두 개의 인덱스 열로 끝났습니다. 그 중 하나는 날짜가 아닌 잘못된 시간의 적절한 날짜를 포함하고 두 번째 인덱스 열은 부정확 한 날짜, 그리고 정확한 시간 대신에, 단지 시간이 아닌. 내 multiindex 시도에 대한 입력 데이터는 다음과 같이 보았다 :

singledf = pd.DataFrame.from_csv("inputfile",header=None,index_col=[0,1],parse_dates=True) 

이처럼 보이는 dataframe 결과 :

singledf.sort() 
singledf 

<class 'pandas.core.frame.DataFrame'> 
MultiIndex: 716244 entries, (<Timestamp: 2009-01-02 00:00:00>, <Timestamp: 2012-11-04  04:51:00>) to (<Timestamp: 2012-11-02 00:00:00>, <Timestamp: 2012-11-04 20:00:00>) 
Data columns: 
X2 716244 non-null values 
X3 716244 non-null values 
X4 716244 non-null values 
X5 716244 non-null values 
X6 716244 non-null values 
dtypes: float64(4), int64(1) 
이 코드를 사용하여 읽으려고

20090102,04:51:00,89.9900,89.9900,89.9900,89.9900,100 
20090102,05:36:00,90.0100,90.0100,90.0100,90.0100,200 
20090102,05:44:00,90.1400,90.1400,90.1400,90.1400,100 
20090102,05:50:00,90.0500,90.0500,90.0500,90.0500,500 
20090102,05:56:00,90.1000,90.1000,90.1000,90.1000,300 
20090102,05:57:00,90.1000,90.1000,90.1000,90.1000,200 

아마도 멀티 인덱스 방식은 완전히 잘못되었지만 시도한 한 가지입니다. 그것은 datetime 개체를 사용하는 것에 붙어있는 것처럼 보이고 인덱스 열이 날짜 또는 시간 대신 datetime을 갖도록 강제하려고합니다. 내 비 멀티 인덱스 시도를위한 내 소스 CSV 파일은 다음과 같습니다.

20090102 04:51:00,89.9900,89.9900,89.9900,89.9900,100 
20090102 05:36:00,90.0100,90.0100,90.0100,90.0100,200 
20090102 05:44:00,90.1400,90.1400,90.1400,90.1400,100 
20090102 05:50:00,90.0500,90.0500,90.0500,90.0500,500 
20090102 05:56:00,90.1000,90.1000,90.1000,90.1000,300 

나는 팬더 .9를 사용하고 있습니다. 모든 제안을 부탁드립니다!

답변

2

일반 DatetimeIndex에서는 between_time 메서드를 사용할 수 있습니다.

In [12]: data = """\ 
20090102,04:51:00,89.9900,89.9900,89.9900,89.9900,100 
20090102,05:36:00,90.0100,90.0100,90.0100,90.0100,200 
20090102,05:44:00,90.1400,90.1400,90.1400,90.1400,100 
20090102,05:50:00,90.0500,90.0500,90.0500,90.0500,500 
20090102,05:56:00,90.1000,90.1000,90.1000,90.1000,300 
20090102,05:57:00,90.1000,90.1000,90.1000,90.1000,200 
""" 

In [13]: singledf = pd.DataFrame.from_csv(StringIO(data), header=None, parse_dates=[[0,1]]) 

In [14]: singledf 
Out[14]: 
         X2  X3  X4  X5 X6 
X0_X1 
2009-01-02 04:51:00 89.99 89.99 89.99 89.99 100 
2009-01-02 05:36:00 90.01 90.01 90.01 90.01 200 
2009-01-02 05:44:00 90.14 90.14 90.14 90.14 100 
2009-01-02 05:50:00 90.05 90.05 90.05 90.05 500 
2009-01-02 05:56:00 90.10 90.10 90.10 90.10 300 
2009-01-02 05:57:00 90.10 90.10 90.10 90.10 200 

In [15]: singledf.between_time('5:30:00', '5:45:00') 
Out[15]: 
         X2  X3  X4  X5 X6 
X0_X1 
2009-01-02 05:36:00 90.01 90.01 90.01 90.01 200 
2009-01-02 05:44:00 90.14 90.14 90.14 90.14 100 
+0

감사합니다. 이것은 내가 찾고있는 것처럼 보입니다. 그러나 마지막 행을 실행하면 다음과 같이 표시됩니다. "AttributeError : 'DataFrame'객체에 'between_time'속성이 없습니다. 오류가 발생했습니다. 나는 판다 0.9.0을 달리고있다. 나는 그것을 가져야한다고 생각한다. 아이디어가 있습니까? 감사. – Jeff

+0

아, 신경 쓰지 마, 나는 github에서 최신 팬더를 꺼냈다. 이제 dataframe.between_time이 생겼다. 2010 년 10 월에 새로 나온 무언가가 될 것 같습니다. 아마도 TimeSeries 만 이전에 가지고 있었을 것입니다. 이제는 이미 발견하지 못해서 나쁘지 않습니다. 감사! – Jeff