2016-02-24 2 views
1

Обновление: Я обновил свой пример, чтобы прояснить мой вопрос чуток
У меня есть фрейм данных с указателем даты и значения, как:Реаметр с заданным интервалом в Пандах?

  date | value |   
     ------------+-------| 
category 
    A  2016-01-04 |  6 | 
      2016-01-05 |  4 | 
      2016-01-07 | 16 | 
      2016-01-10 |  0 | 
      2016-01-12 |  7 | 
    B  2016-01-20 |  0 | 
      2016-01-22 |  8 | 
      2016-01-29 |  5 | 
      2016-01-30 |  4 | 

Я хочу ресэмплировать кадр данных, но и между определенный интервал скажите '2016-01-01' до '2016-01-31' для каждой категории и заполните все значения Na нулем.

Это то, что я хочу:

   date | value |   
     ------------+-------| 
Category 
    A 2016-01-01 |  0 | 
      2016-01-02 |  0 | 
      2016-01-03 |  0 | 
      2016-01-04 |  6 | 
    ..... 
      2016-01-29 |  0 | 
      2016-01-30 |  0 | 
      2016-01-31 |  0 | 
    B 2016-01-01 |  0 | 
      2016-01-02 |  0 | 
      2016-01-03 |  0 | 
      2016-01-04 |  0 | 
    ..... 

      2016-01-29 |  5 | 
      2016-01-30 |  4 | 
      2016-01-31 |  0 | 

я могу заставить его работать этим: (. Однако его очень медленно Есть ли лучший способ?) Пусть Вышеприведенная таблица хранится в кадре данных называется данные

idx = pd.DatetimeIndex(start='2016-1-1', end='2016-1-31', freq='D') 
df=pd.DataFrame(columns=['category','date','value']) 
data.reset_index('category',inplace=True) 
for a,b in data.groupby(['category']): 
b.set_index('date',inplace=True) 
b.reindex(idx,fill_value=0) 
b.reset_index('date') 
df=pd.concat([df,b]) 

Это также отнимает много памяти. Я не хочу сначала создавать индекс даты, а затем добавлять значения. Есть ли способ трансформировать вышеприведенный с использованием пересчета.

ответ

0

Решение было бы создать dataframe с полным диапазоном дат, наполненную 0s:

df2 = pd.DataFrame(0, index=pd.date_range('2016-01-01', '2016-01-31'), columns=['values']) 

Затем использовать combine_first, чтобы заполнить его с исходными значениями, когда в наличии:

df.combine_first(df2) 

Выход:

  values 
2016-01-01  0 
2016-01-02  0 
2016-01-03  0 
2016-01-04  6 
2016-01-05  4 
2016-01-06  0 
2016-01-07  16 
2

Я считаю, вы хотите указать даты начала и окончания и n переиндексировать ваши повторно дискретизированные данные (Pandas 0.17+).

# Sample data. 
df = pd.DataFrame({'a': range(5), 'b': range(5)}, index=pd.DatetimeIndex(start='2016-1-1', periods=5, freq='D')) 

idx = pd.DatetimeIndex(start='2016-1-1', end='2016-2-29', freq='D') # freq='B' for weekdays. 
df.reindex(idx, fill_value=0).head(8) 
      a b 
2016-01-01 0 0 
2016-01-02 1 1 
2016-01-03 2 2 
2016-01-04 3 3 
2016-01-05 4 4 
2016-01-06 0 0 
2016-01-07 0 0 
2016-01-08 0 0 
+0

Привет, спасибо за ваш soltn. Тем не менее, я пытаюсь переиндексировать даты в объекте groupBy. У меня есть несколько категорий, каждая категория имеет дату и некоторые значения. Я хочу определенный интервал для всех категорий, и каждый из них заполняется 0, если отсутствует значение даты. – CoderBC

Смежные вопросы