2013-10-01 8 views
16

Ben zaman endeksli veriler var:pandalar - Tüm sütunları yeni satırlar için NaN'ye ayarlayan bir DataFrame Dizini uzat?

df2 = pd.DataFrame({ 'day': pd.Series([date(2012, 1, 1), date(2012, 1, 3)]), 'b' : pd.Series([0.22, 0.3]) }) 
df2 = df2.set_index('day') 
df2 
       b 
day    
2012-01-01 0.22 
2012-01-03 0.30 

Ne tüm sütunlar NaN ayarlanır Ocak 2012 (diyelim ki), (her gün için bir satır vardır, böylece bu veri çerçevesini genişletmek için en iyi yoldur Burada sadece b) nerede veri yok?

Yani istenen sonucu olacaktır:

   b 
day    
2012-01-01 0.22 
2012-01-02 NaN 
2012-01-03 0.30 
2012-01-04 NaN 
... 
2012-01-31 NaN 

çok teşekkür ederiz!

cevap

3

Eğer ikinci bölümünü cevaplamak için

df3 = df2.asfreq('D') 
df3 

Out[16]: 
       b 
2012-01-01 0.22 
2012-01-02 NaN 
2012-01-03 0.30 

istediğiniz gibi ben daha şık bir şekilde de düşünemiyorum, NaN dolu olacak fill_method parametre eksik değerlerini belirtmeden, frekans olarak gün geçtikçe yeniden örneklemek an:

df3 = DataFrame({ 'day': Series([date(2012, 1, 4), date(2012, 1, 31)])}) 
df3.set_index('day',inplace=True) 
merged = df2.append(df3) 
merged = merged.asfreq('D') 
merged 


Out[46]: 
       b 
2012-01-01 0.22 
2012-01-02 NaN 
2012-01-03 0.30 
2012-01-04 NaN 
2012-01-05 NaN 
2012-01-06 NaN 
2012-01-07 NaN 
2012-01-08 NaN 
2012-01-09 NaN 
2012-01-10 NaN 
2012-01-11 NaN 
2012-01-12 NaN 
2012-01-13 NaN 
2012-01-14 NaN 
2012-01-15 NaN 
2012-01-16 NaN 
2012-01-17 NaN 
2012-01-18 NaN 
2012-01-19 NaN 
2012-01-20 NaN 
2012-01-21 NaN 
2012-01-22 NaN 
2012-01-23 NaN 
2012-01-24 NaN 
2012-01-25 NaN 
2012-01-26 NaN 
2012-01-27 NaN 
2012-01-28 NaN 
2012-01-29 NaN 
2012-01-30 NaN 
2012-01-31 NaN 

Bu ikinci kez serisini oluşturur ve daha sonra biz sadece ekleme ve daha önce olduğu gibi asfreq('D') diyoruz.

+0

Teşekkürler - Bu delikleri doldurmak için harika ama nasıl '2012-01-31' uzatabilirsiniz (söylemek). – paul

+0

Hmmh. Ama orijinal zaman serisinde birden fazla delik/boşluk varsa, bu daha fazla çalışmayabilir. – paul

+0

@paul evet cevabım bu açıdan sınırlıdır, daha genel bir yöntem düşünemiyorum. DataFrame'i ilk etapta beklenen tüm değerlerle oluşturmak daha iyi olurdu, eğer bir alanım olacak ve daha iyi bir şeyle gelip gelemeyeceğimi göreceğim. – EdChum

17

bunu kullanın:

ix = pd.DatetimeIndex(start=date(2012, 1, 1), end=date(2012, 1, 31), freq='D') 
df2.reindex(ix) 

verir:

   b 
2012-01-01 0.22 
2012-01-02 NaN 
2012-01-03 0.30 
2012-01-04 NaN 
2012-01-05 NaN 
[...] 
2012-01-29 NaN 
2012-01-30 NaN 
2012-01-31 NaN 
2

Burada başka seçenek: İlk sonra yeniden örneklemek, istediğiniz son gününde bir NaN kayıt ekleyin. Bu şekilde yeniden örnekleme, sizin için eksik tarihleri ​​dolduracaktır.

Başlangıç ​​Çerçeve:

import pandas as pd 
import numpy as np 
from datetime import date 

df2 = pd.DataFrame({ 'day': pd.Series([date(2012, 1, 1), date(2012, 1, 3)]), 'b' : pd.Series([0.22, 0.3]) }) 
df2= df2.set_index('day') 
df2 

Out: 
        b 
    day 
    2012-01-01 0.22 
    2012-01-03 0.30 

Dolgulu Çerçeve:

df2 = df2.set_value(date(2012,1,31),'b',np.float('nan')) 
df2.asfreq('D') 

Out: 
       b 
    day 
    2012-01-01 0.22 
    2012-01-02 NaN 
    2012-01-03 0.30 
    2012-01-04 NaN 
    2012-01-05 NaN 
    2012-01-06 NaN 
    2012-01-07 NaN 
    2012-01-08 NaN 
    2012-01-09 NaN 
    2012-01-10 NaN 
    2012-01-11 NaN 
    2012-01-12 NaN 
    2012-01-13 NaN 
    2012-01-14 NaN 
    2012-01-15 NaN 
    2012-01-16 NaN 
    2012-01-17 NaN 
    2012-01-18 NaN 
    2012-01-19 NaN 
    2012-01-20 NaN 
    2012-01-21 NaN 
    2012-01-22 NaN 
    2012-01-23 NaN 
    2012-01-24 NaN 
    2012-01-25 NaN 
    2012-01-26 NaN 
    2012-01-27 NaN 
    2012-01-28 NaN 
    2012-01-29 NaN 
    2012-01-30 NaN 
    2012-01-31 NaN 
İlgili konular