2016-09-21 7 views
6

मेरे पास dt नामक डेटाटाइम प्रकार कॉलम के साथ एक विशाल डेटाफ्रेम है, डेटा फ्रेम को पहले से ही dt पर आधारित किया गया है। मैं dt के आधार पर डेटाफ्रेम को कई डेटाफ्रेम में विभाजित करना चाहता हूं, प्रत्येक डेटाफ्रेम में 1 hr रेंज के भीतर पंक्तियां होती हैं।पांडस अंतराल द्वारा कॉलम द्वारा डेटाफ्रेम को विभाजित करने के लिए कैसे करें

स्प्लिट

dt     text 
0 20160811 11:05  a 
1 20160811 11:35  b 
2 20160811 12:03  c 
3 20160811 12:36  d 
4 20160811 12:52  e 
5 20160811 14:32  f 

dt     text 
0 20160811 11:05  a 
1 20160811 11:35  b 
2 20160811 12:03  c 

    dt     text 
0 20160811 12:36  d 
1 20160811 12:52  e 

    dt     text 
0 20160811 14:32  f 
+0

द्वारा एक सवाल के रूप में पूछें - नहीं एक "मैं चाहता हूँ"। – charlesreid1

उत्तर

7

में आप astype द्वारा स्तंभ dthour करने के लिए परिवर्तित की पहली मूल्य के अंतर से groupby की जरूरत है:

S = pd.to_datetime(df.dt) 
for i, g in df.groupby([(S - S[0]).astype('timedelta64[h]')]): 
     print (g.reset_index(drop=True)) 

       dt text 
0 20160811 11:05 a 
1 20160811 11:35 b 
2 20160811 12:03 c 
       dt text 
0 20160811 12:36 d 
1 20160811 12:52 e 
       dt text 
0 20160811 14:32 f 

तो List comprehension lution:

S = pd.to_datetime(df.dt) 

print ((S - S[0]).astype('timedelta64[h]')) 
0 0.0 
1 0.0 
2 0.0 
3 1.0 
4 1.0 
5 3.0 
Name: dt, dtype: float64 

L = [g.reset_index(drop=True) for i, g in df.groupby([(S - S[0]).astype('timedelta64[h]')])] 

print (L[0]) 
       dt text 
0 20160811 11:05 a 
1 20160811 11:35 b 
2 20160811 12:03 c 

print (L[1]) 
       dt text 
0 20160811 12:36 d 
1 20160811 12:52 e 

print (L[2]) 
       dt text 
0 20160811 14:32 f 

पुरानी समाधान है, जो hour द्वारा विभाजित:

आप groupbydt.hour से उपयोग कर सकते हैं, लेकिन पहले परिवर्तित जरूरत dtto_datetime:

for i, g in df.groupby([pd.to_datetime(df.dt).dt.hour]): 
    print (g.reset_index(drop=True)) 

       dt text 
0 20160811 11:05 a 
1 20160811 11:35 b 
       dt text 
0 20160811 12:03 c 
1 20160811 12:36 d 
2 20160811 12:52 e 
       dt text 
0 20160811 14:32 f 

List comprehension समाधान:

L = [g.reset_index(drop=True) for i, g in df.groupby([pd.to_datetime(df.dt).dt.hour])] 

print (L[0]) 
       dt text 
0 20160811 11:05 a 
1 20160811 11:35 b 

print (L[1]) 
       dt text 
0 20160811 12:03 c 
1 20160811 12:36 d 
2 20160811 12:52 e 

print (L[2]) 
       dt text 
0 20160811 14:32 f 

datetime करने के लिए स्तंभ dt परिवर्तित करने के साथ

या का उपयोग list comprehension:

df.dt = pd.to_datetime(df.dt) 
L =[g.reset_index(drop=True) for i, g in df.groupby([df['dt'].dt.hour])] 

print (L[1]) 
        dt text 
0 2016-08-11 12:03:00 c 
1 2016-08-11 12:36:00 d 
2 2016-08-11 12:52:00 e 

print (L[2]) 
        dt text 
0 2016-08-11 14:32:00 f 

तो date और hour रों द्वारा विभाजित की जरूरत:

#changed dataframe for testing 
print (df) 
       dt text 
0 20160811 11:05 a 
1 20160812 11:35 b 
2 20160813 12:03 c 
3 20160811 12:36 d 
4 20160811 12:52 e 
5 20160811 14:32 f 

serie = pd.to_datetime(df.dt) 
for i, g in df.groupby([serie.dt.date, serie.dt.hour]): 
    print (g.reset_index(drop=True)) 
       dt text 
0 20160811 11:05 a 
       dt text 
0 20160811 12:36 d 
1 20160811 12:52 e 
       dt text 
0 20160811 14:32 f 
       dt text 
0 20160812 11:35 b 
       dt text 
0 20160813 12:03 c  
+0

धन्यवाद, अगर मैं 2 घंटे तक समूह करना चाहता हूं तो क्या होगा? – 9blue

+0

मुझे लगता है कि आपको केवल '2'' जोड़ने की आवश्यकता है, 'astype (' timedelta64 [2h] ')) ' – jezrael

2

तारीखों के अंतर ले पहली तारीख और समूह के साथ total_seconds

df.groupby((df.dt - df.dt[0]).dt.total_seconds() // 3600, 
      as_index=False).apply(pd.DataFrame.reset_index, drop=True) 

enter image description here

संबंधित मुद्दे

 संबंधित मुद्दे