2016-05-24 5 views
1

У меня есть один DataFrame в Python 3.5, такие как:как найти точное местоположение максимального значения из кадра данных в Python 3.5- модифицирована

In [1]:tway5new.info() 
<class 'pandas.core.frame.DataFrame'> 
Index: 44 entries, to VOI 
Columns: 43802 entries, 2011-01-01 00:00:00 to 2015-12-31 23:00:00 
dtypes: int64(43802) 
memory usage: 14.7+ MB 

И имя столбца для этого Dataframe является:

In [2]:tway5new.columns 
Out[2]: 
DatetimeIndex(['2011-01-01 00:00:00', '2011-01-01 01:00:00', 
      '2011-01-01 02:00:00', '2011-01-01 03:00:00', 
      ... 
      '2015-12-31 20:00:00', '2015-12-31 21:00:00', 
      '2015-12-31 22:00:00', '2015-12-31 23:00:00'], 
      dtype='datetime64[ns]', name='timenew', length=43802, freq=None) 

Я хочу подмножить этот DataFrame в последовательность относительно небольшого фрейма данных, то есть каждый небольшой фрейм данных включал только одну типичную дневную запись, такую ​​как: Первый небольшой фрейм данных содержал информацию от '2011-01-01 00: 00:00 'до' 2011-01-01 23:00:00 ', второй небольшой контур данных с 2011-01-02 00:00:00 'до' 2011-01-02 23:00:00 ', .... до 1826-го небольшой кадр данных содержал информацию от' 2015-12-31 00:00 : 00 'до' 2015-12-31 23:00:00 '.

Согласно @EdChum помощи, я попытался следующий код:

df = tway5new.T 
df.resample('d') 
demean = lambda x: abs(x - x.mean()) 
Asub=df.groupby([df.index.year, df.index.month, df.index.day]).transform(demean) 
#TO obtain the absolute difference between hours record and average hours record for each column### 
Asubmax=Asub.groupby([df.index.year, df.index.month, df.index.day]).max() 
AsubmaxID=Asubmax.idxmax(axis=1) 

Это дало индекс максимального значения для каждого типичного дня по столбцам, т.е., от 2011-01-01 до 2015-12 -31:

with pd.option_context('display.max_rows',10,'display.max_columns',6): 
    print (AsubmaxID) 
2011 1 1  UNF 
      2  NAT 
      3  NAT 
      4  NAT 
      5  NAT 

2015 12 27 NAT 
      28 NAT 
      29 NAT 
      30 NAT 
      31 GOA 
dtype: object 


BmaxID=Asub.groupby([df.index.year, df.index.month, df.index.day]).idxmax(axis=1) 

Это дало индекс максимального значения для каждого часа записи по столбцам, т.е., от 2011-01-01 00:00:00 до 2015-12-31 23:00:00:

with pd.option_context('display.max_rows',10,'display.max_columns',6): 
    print (BmaxID) 
      timenew    
2011 1 1 2011-01-01 00:00:00 UNF 
       2011-01-01 01:00:00 NAT 
       2011-01-01 02:00:00 RTF 
       2011-01-01 03:00:00 UNF 
       2011-01-01 04:00:00 NAT 

2015 12 31 2015-12-31 19:00:00 NAT 
       2015-12-31 20:00:00 NAT 
       2015-12-31 21:00:00 GOA 
       2015-12-31 22:00:00 NAT 
       2015-12-31 23:00:00 GOA 
dtype: object 

Теперь, как найти индекс максимального значения для каждого типичного дня с точной записью часа, например, я знаю, что индекс максимального максимального значения для первой даты 2011-01-01 был столбом UNF, но как я могу получить точную запись часа для этой колонки UNF в 2011-01-01, т.е. какая запись часа (2011-01-01 00:00:00 или 2011-01-01 03:00:00) имеет максимальное значение?

Большое спасибо

ответ

0

IIUC вы бы лучше сделать столбцы индекса, а затем вы можете resample или фильтр на день:

df = tway5new.T 

то Downsample

df.resample('d') 

или группы в день:

df.groupby([df.index.year, df.index.month, df.index.day]) 
+0

Спасибо @EdChum. Как вы предположили, я нашел другое решение для этого: 'y1 = tway5new.filter (like = '2011-01-01')' – TWord

+0

Это звучит не очень динамично, так как требуется, чтобы вы передавали строку фильтра каждый time – EdChum

+0

После каждого небольшого подмножества данных, которое я получил, я проведу строку Mean для такого небольшого кадра данных. Поэтому я думаю, что создаю цикл для определения итерации i с 2011-01-01 по 2015-12-31 – TWord