Извлечение значений данных, относящихся к дню, и вычисление среднего значения для каждого дня - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть набор данных с диапазоном дат с 12 января по 3 августа 2018 года с некоторыми значениями:

enter image description here

Размерность df_luminosidad DataFrameis:

df_luminosidad.shape
(9752, 2)

Каждая строка данных имеет частоту получаса.Первая строка начинается в 2018-01-12

df_luminosidad.iloc[0]

Fecha:       2018-01-12 00:17:28
Luz (lux)                      1
Name: 0, dtype: object

, а последняя строка заканчивается в 2018-08-03

df_luminosidad.tail(1)

Fecha:  Luz (lux)
9751    2018-08-03 23:44:59 1

Есть много строк, которые соответствуют одному дню, как указано выше.

Я хочу создать новый фрейм данных, выбрав только 1 день в качестве значения для столбца Fecha: (без повторяющейся даты) и выбрать среднее значение из всех существующих значений для выбранной даты Luz(lux) column

Это будет выглядеть следующим образом:

|  Fecha:     |  Luz(lux) - Average each day values |
|  2018-01-12 |  9183.479167                        |
|  2018-01-13 |  7431.8125                          |
|  2018-01-14 |  11073.1875                         |
|  2018-01-15 |  11456.25                           |
|      .             .                              |
|      .             .                              |
|      .             .                              |
|  2018-08-03 |  11331.229167                       |

Я использую функцию pd.date_range() для создания кадра данных со значениями от df_luminosidad предыдущего кадра данных до указанной частоты, такой как обозначено @ piRSquared в этом ответе

С 12 января по 3 августа есть 203 дня (28 недель), затем я выбираю 204, например атрибут period, и я используюfreq атрибут частоты календарного дня D

df = pd.DataFrame(dict(
    Date=pd.date_range('2018-01-12', periods=204, freq='D'),
    Value=df_luminosidad['Luz (lux)'].mean()   
))

До сих пор подход хорош, но у меня есть сомнения относительно того, как вычислить среднее значение Luz (lux) для каждого дня, выбранного с помощью pd.date_range, потому что в этот момент я просто получаюВерифицируйте одно и то же значение для всех дней от 2018-01-12 до 2018-08-03, например:

|  Date       |  Value        |
|  2018-01-12 |  11228.888331 |                       
|  2018-01-13 |  11228.888331 |                         
|  2018-01-14 |  11228.888331 |                        
|  2018-01-15 |  11228.888331 |                          
|      .             .        |                      
|      .             .        |                      
|      .             .        |                      
|  2018-08-03 |  11331.229167 | 

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

Как я могу сгенерировать циклически, группируя все значения дня в единственное среднее значение по каждому дню и помещая их в один кадр данных?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Для анализа временных рядов сначала преобразуйте столбец даты в индекс, если это возможно, и после этого удобно использовать с датами.

df = pd.read_csv('file_name.csv', parse_dates =['Fecha'], index_col='Fecha')

Затем вы можете извлечь любое значение даты в другой временный фрейм данных.

dates = pd.date_range(start='2018-01-12 ', end='2018-08-03 ')

Теперь, используя цикл for, ранжируйте каждую дату из списка «даты», а затем выберите необходимую часть вашего набора данных в другом фрейме данных.

new_df = pd.DataFrame()   # Creating temporary data frame to store each day value
for temp_date in dates:
    required_date = str(temp_date)[:10]     # this is to fetch only date value from whole time stamp
    new_df = df1[required_date]  
# Now our requrired data is in new dataframe, and we can do all things to our new dataframe. 

Возможно, это наивный метод, но сейчас у меня есть для вас много советов. Надеюсь, что это работает.

0 голосов
/ 11 сентября 2018

Я считаю нужным resample с mean или совокупностью mean с Grouper:

df_luminosidad['Fecha:'] = pd.to_datetime(df_luminosidad['Fecha:'])

df = df_luminosidad.resample('D', on='Fecha:')['Luz (lux)'].mean().reset_index()

Или:

df = (df_luminosidad.groupby(pd.Grouper(key='Fecha:', freq='D'))['Luz (lux)']
                    .mean()
                    .reset_index())

Другие решения с DatetimeIndex:

df_luminosidad['Fecha:'] = pd.to_datetime(df_luminosidad['Fecha:'])
df_luminosidad = df_luminosidad.set_index('Fecha:')


df = df_luminosidad.resample('D')['Luz (lux)'].mean().reset_index()
df = df_luminosidad.groupby(pd.Grouper(freq='D'))['Luz (lux)'].mean().reset_index()
...