2016-11-11 21 views
7

günün başında başlayan ve çok seviyorum ama bu sorunu çözemiyorum: Bir DataFrame df.head() varGruplama Pandalar DataFrame n gün ben sadece Pandalar gücünü keşfettiler

:

:
lon lat h filename     time 
0 19.961216 80.617627 -0.077165  60048 2002-05-15 12:59:31.717467 
1 19.923916 80.614847 -0.018689  60048 2002-05-15 12:59:31.831467 
2 19.849396 80.609257 -0.089205  60048 2002-05-15 12:59:32.059467 
3 19.830776 80.607857  0.076485  60048 2002-05-15 12:59:32.116467 
4 19.570708 80.588183  0.162943  60048 2002-05-15 12:59:32.888467 

dokuz günlük aralıklarla

gb = df.groupby(pd.TimeGrouper(key='time', freq='9D')) 

ilk grup içine gruba verilerimi istiyorum Ben istiyorum gibi günün başından itibaren (31.717467: 59 12) ve değil:

2002-05-15 12:59:31.717467  lon lat h filename     time 
0 19.961216 80.617627 -0.077165  60048 2002-05-15 12:59:31.717467 
1 19.923916 80.614847 -0.018689  60048 2002-05-15 12:59:31.831467 
2 19.849396 80.609257 -0.089205  60048 2002-05-15 12:59:32.059467 
3 19.830776 80.607857  0.076485  60048 2002-05-15 12:59:32.116467 
... 

Sonraki grup

2002-05-24 12:59:31.717467  lon lat height filename     time 
815 18.309498 80.457024  0.187387  60309 2002-05-24 16:35:39.553563 
816 18.291458 80.458514  0.061446  60309 2002-05-24 16:35:39.610563 
817 18.273408 80.460014  0.129255  60309 2002-05-24 16:35:39.667563 
818 18.255358 80.461504  0.046761  60309 2002-05-24 16:35:39.724563 
... 

Yani veriler ilk kez sayılarak dokuz günde toplanmıştır.

bir gün gruplama:

gb = df.groupby(pd.TimeGrouper(key='time', freq='D')) 

bana verir:

2002-05-15 00:00:00  lon lat h filename     time 
0 19.961216 80.617627 -0.077165  60048 2002-05-15 12:59:31.717467 
1 19.923916 80.614847 -0.018689  60048 2002-05-15 12:59:31.831467 
2 19.849396 80.609257 -0.089205  60048 2002-05-15 12:59:32.059467 
3 19.830776 80.607857  0.076485  60048 2002-05-15 12:59:32.116467 
... 

elimden gün içinde sadece döngü ben dokuz gün aralığı olsun, ama akıllı yapılabilir düşünüyorum kadar Ben sadece günler için YS'ye (yıl başlangıcı) eşdeğer bir Grouper freq seçeneği arıyorum, başlangıç ​​zamanını ayarlama yolu (belki de Gruplayıcı seçeneği convention : {‘start’, ‘end’, ‘e’, ‘s’} tarafından) veya ??? Ben Python 3.5.2 ve pandalar çalıştırıyorum

sürümünde şudur: Verilen günü gece yarısına kadar tarihsaat kırparsanız beklendiği gibi gruplama çalışacak

+0

[Bu cevap] (http://stackoverflow.com/a/22528074/754456) parametresini '= 'left'' bunu yapabilir kapalı ekleyerek önerir? – mfitzp

+0

Denedim ama bir şey değiştirmiyor – user1643523

+0

Hiçbir şey yapmıyor mu? Belgeler, TimeGrouper'ın yaptığı parametrelerin ne olduğu konusunda ciddi olarak eksik. – mfitzp

cevap

1

İlk kez bırakılıyor sıra: Zaman 00:00:00 (gece yarısı) ve gruba sıfırlanır böylece

Yapabileceğiniz en iyi şey 9D aralığına göre normalizedatetime sütunun ilk satırı olacaktır:

df.loc[0, 'time'] = df['time'].iloc[0].normalize() 
for _, grp in df.groupby(pd.TimeGrouper(key='time', freq='9D')): 
    print (grp) 

#   lon  lat   h filename      time 
# 0 19.961216 80.617627 -0.077165  60048 2002-05-15 00:00:00.000000 
# 1 19.923916 80.614847 -0.018689  60048 2002-05-15 12:59:31.831467 
# 2 19.849396 80.609257 -0.089205  60048 2002-05-15 12:59:32.059467 
# 3 19.830776 80.607857 0.076485  60048 2002-05-15 12:59:32.116467 
# 4 19.570708 80.588183 0.162943  60048 2002-05-15 12:59:32.888467 
# ...................................................................... 

Bu, diğer satırlardaki zamanı geri yükler ve böylece bu bilgileri kaybetmezsiniz.


ilk kez satır tutulması:

Ne olduğunu ve kendisine herhangi bir değişiklik yapmaması olarak ilk kez satır tutmak istiyorum, ama sadece itibaren gece yarısından gruplama başlamak istiyorsanız, yapabileceğin:

df_t_shift = df.shift() # Shift one level down 
df_t_shift.loc[0, 'time'] = df_t_shift['time'].iloc[1].normalize() 
# Concat last row of df with the shifted one to account for the loss of row 
df_t_shift = df_t_shift.append(df.iloc[-1], ignore_index=True) 

for _, grp in df_t_shift.groupby(pd.TimeGrouper(key='time', freq='9D')): 
    print (grp) 

#   lon  lat   h filename      time 
# 0  NaN  NaN  NaN  NaN 2002-05-15 00:00:00.000000 
# 1 19.961216 80.617627 -0.077165 60048.0 2002-05-15 12:59:31.717467 
# 2 19.923916 80.614847 -0.018689 60048.0 2002-05-15 12:59:31.831467 
# 3 19.849396 80.609257 -0.089205 60048.0 2002-05-15 12:59:32.059467 
# 4 19.830776 80.607857 0.076485 60048.0 2002-05-15 12:59:32.116467 
# 5 19.570708 80.588183 0.162943 60048.0 2002-05-15 12:59:32.888467 
+1

Cevabınız için teşekkürler – user1643523

1

0.19.0 (günün başında başlayan). Ben endeksi datetime olmadıkça örneğin

df['date'] = df['time'].apply(lambda x:x.date()) 

Ancak TimeGrouper kullanamaz, tarihsaat dönüştürerek çalışmak için onu bekleniyor. yerine iki seçeneğiniz var, ya doğrudan gece yarısına tarihsaat kesmek şöyle:

df['date'] = df['time'].apply(lambda x:x.replace(hour=0, minute=0, second=0, microsecond=0))) 

Alternatif olarak, ilk önce, date değerlerini oluşturmak pd.to_datetime() işlevini kullanarak, tarihsaat geri çevirebiliriz:

df['date'] = df['time'].apply(lambda x: x.date()) 
df['date'] = pd.to_datetime(df['date']) 
bununla

df['dateonly'] = df['time'].apply(lambda x: x.date()) 

tek sorun:

+0

Yanıtınız için teşekkürler – user1643523

1

bunu yapabileceğini cevap @mfitzp tamamlayarak df['dateonly'] bir DatetimeIndex

olmaz olduğunu öncelikle onu dönüştürmek gerekir: şimdi

df['dateonly'] = pd.to_datetime(df['dateonly']) 

bunu

gb = df.groupby(pd.TimeGrouper(key='dateonly', freq='9D')) 

bağlı olarak ve ek bilgiler convention grup PeriodIndex değil DatetimeIndex

kullanılır olabilir
+0

Yanıtınız için teşekkürler – user1643523