2012-11-13 27 views
15

Tarihler tarafından tarihler tarafından girilen ve gözlemlerin tamsayı sayısına karşılık gelen değerlere sahip bir sözlük adı date_dict var. Bunu, sürekli tarihlerle birlikte bir seriye/veri çerçevesine katılmak veya dönüştürmek istediğim sansürlenmiş gözlemlerle seyrek bir seri/dataframe dönüştürüyorum. Kötü liste anlayışı, pandaların, otomatik olarak tarihler arası tarih nesnelerini uygun bir DateTime endeksine otomatik olarak gizlemeyecekleri gerçeğini ortadan kaldırmaya çalışmamdır.Sürekli pandalar veri çerçevesini seyrek veri çerçevesinden doldurma

df1 = pd.DataFrame(data=date_dict.values(), 
        index=[datetime.datetime.combine(i, datetime.time()) 
          for i in date_dict.keys()], 
        columns=['Name']) 
df1 = df1.sort(axis=0) 

Bu örnek 1258 gözlem vardır ve DateTime endeksi 2003-06-24 den 2012-11-07 çalışır.

df1.head() 
      Name 
Date 
2003-06-24 2 
2003-08-13 1 
2003-08-19 2 
2003-08-22 1 
2003-08-24 5 

Ben sürekli DateTime indeksi boş dataframe oluşturabilirsiniz, ancak bu gereksiz bir sütunu tanıtır ve aksak görünüyor. Bir katılımı içeren daha zarif bir çözümü kaçırıyormuş gibi hissediyorum. (1) sürekli bir indeks, (2) NaN'ler 0sn, ve (3) hiçbir orada yoktur, böylece

df2 = pd.DataFrame(data=None,columns=['Empty'], 
        index=pd.DateRange(min(date_dict.keys()), 
             max(date_dict.keys()))) 
df3 = df1.join(df2,how='right') 
df3.head() 
      Name Empty 
2003-06-24 2 NaN 
2003-06-25 NaN NaN 
2003-06-26 NaN NaN 
2003-06-27 NaN NaN 
2003-06-30 NaN NaN 

seyrek dataframe gelen sürekli bir dataframe doldurmak için daha basit ya da daha şık bir yolu var mı Dataframe'de soldaki boş sütun?

  Name 
2003-06-24 2 
2003-06-25 0 
2003-06-26 0 
2003-06-27 0 
2003-06-30 0 

cevap

20

Sadece kendi tarih aralığını kullanarak bir zaman serisine ANDA kullanabilirsiniz. Ayrıca, bir DataSpace yerine bir TimeSeries kullanmak daha iyi olurdu gibi görünüyor (bkz. documentation), reindexing de DataFrames eksik dizin değerleri eklemek için doğru bir yöntemdir. Örneğin

ile başlayan:

2003-06-24 2 
2003-08-13 1 
2003-08-19 2 
2003-08-22 1 
2003-08-24 5 

Basitçe

ts.reindex(pd.date_range(min(date_index), max(date_index))) 

sonra bir fihrist verir yapıyor:

date_index = pd.DatetimeIndex([pd.datetime(2003,6,24), pd.datetime(2003,8,13), 
     pd.datetime(2003,8,19), pd.datetime(2003,8,22), pd.datetime(2003,8,24)]) 

ts = pd.Series([2,1,2,1,5], index=date_index) 

size örnek dataframe kafası gibi bir zaman serilerini verir Kayıp değerleriniz için NaN'ler ile (eğer milleri doldurmak isterseniz fillna kullanabilirsiniz) diğer değerlerle ssing değerleri - bkz.):

2003-06-24  2 
2003-06-25 NaN 
2003-06-26 NaN 
2003-06-27 NaN 
2003-06-28 NaN 
2003-06-29 NaN 
2003-06-30 NaN 
2003-07-01 NaN 
2003-07-02 NaN 
2003-07-03 NaN 
2003-07-04 NaN 
2003-07-05 NaN 
2003-07-06 NaN 
2003-07-07 NaN 
2003-07-08 NaN 
2003-07-09 NaN 
2003-07-10 NaN 
2003-07-11 NaN 
2003-07-12 NaN 
2003-07-13 NaN 
2003-07-14 NaN 
2003-07-15 NaN 
2003-07-16 NaN 
2003-07-17 NaN 
2003-07-18 NaN 
2003-07-19 NaN 
2003-07-20 NaN 
2003-07-21 NaN 
2003-07-22 NaN 
2003-07-23 NaN 
2003-07-24 NaN 
2003-07-25 NaN 
2003-07-26 NaN 
2003-07-27 NaN 
2003-07-28 NaN 
2003-07-29 NaN 
2003-07-30 NaN 
2003-07-31 NaN 
2003-08-01 NaN 
2003-08-02 NaN 
2003-08-03 NaN 
2003-08-04 NaN 
2003-08-05 NaN 
2003-08-06 NaN 
2003-08-07 NaN 
2003-08-08 NaN 
2003-08-09 NaN 
2003-08-10 NaN 
2003-08-11 NaN 
2003-08-12 NaN 
2003-08-13  1 
2003-08-14 NaN 
2003-08-15 NaN 
2003-08-16 NaN 
2003-08-17 NaN 
2003-08-18 NaN 
2003-08-19  2 
2003-08-20 NaN 
2003-08-21 NaN 
2003-08-22  1 
2003-08-23 NaN 
2003-08-24  5 
Freq: D, Length: 62 
+2

Teşekkürler! ts.reindex (pd.date_range (dk (date_index), max (date_index)), fill_value = 0) kullandım –

İlgili konular