Повторная выборка Pandas не изменит временные приращения

#python #pandas #dataframe #datetime

#python #pandas #фрейм данных #дата и время

Вопрос:

У меня есть словарь с 4 разными ключами, которые представляют разные культуры (кукурузу, соевые бобы, озимую пшеницу и яровую пшеницу). Каждый ключ имеет 10 различных массивов данных в качестве значений в словаре (температура, изменение температуры за 24 часа и т.д.). Затем я хочу создать два новых словаря из данных, отделив фактические значения (например, температуру, осадки) от значений изменения за 24 часа. Данные обрабатываются 6 раз в час.

 corn=glob.glob('/Users/eli/Documents/Python_data/plotly_practice/20200812_00/20200812_00_ec_ens_*' 'corn' '_timeseries.nc')
soybean=glob.glob('/Users/eli/Documents/Python_data/plotly_practice/20200812_00/20200812_00_ec_ens_*' 'soybeans' '_timeseries.nc')
winterwheat=glob.glob('/Users/eli/Documents/Python_data/plotly_practice/20200812_00/20200812_00_ec_ens_*' 'winterwheat' '_timeseries.nc')
springwheat=glob.glob('/Users/eli/Documents/Python_data/plotly_practice/20200812_00/20200812_00_ec_ens_*' 'springwheat' '_timeseries.nc')
all_files=[corn, soybean,winterwheat,springwheat]

crop_names=['corn', 'soybeans', 'winterwheat', 'springwheat']
data={}
for i in crop_names:
    for j in all_files:
        data[i]=xr.open_mfdataset(j)
  

Я создаю два пустых словаря, а затем перебираю ключи.

 today=dt.date.today()
df_vals={}
df_deltas={}
for i in data.keys():
  

Далее я заполняю df_vals .

     df_vals[str(i)]=data[i].to_dataframe().reset_index()
    df_vals[i]['time']=pd.date_range((today-dt.timedelta(days=1)), (today dt.timedelta(days=14)), freq='6H')
  

Затем я хочу заполнить df_deltas . Тем не менее, я хочу сделать это немного по-другому. Для дельт меня беспокоит изменение за 24 часа, поэтому мне нужно применить скользящее среднее или сумму, в зависимости от того, является ли переменной температура или осадки.

     df_deltas[i]=df_vals[i].filter(regex='delta')
    df_deltas[i]['time']=pd.date_range((today-dt.timedelta(days=1)), (today dt.timedelta(days=14)), freq='6H')
    df_deltas[i]=df_deltas[i].set_index('time')
    df_deltas[i].loc[:, df_deltas[i].columns.str.contains('precip')]=df_deltas[i].resample('24H').sum()
    df_deltas[i].loc[:, df_deltas[i].columns.str.contains('temp')]=df_deltas[i].resample('24H').mean()
    df_deltas[i]=df_deltas[i].reset_index()
  

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

 df_deltas['corn]

time    2m_temp_24hdelta_prod   2m_temp_24hdelta_area   total_precip_24hdelta_prod  total_precip_24hdelta_area
0   2020-08-13 00:00:00 0.228715    0.161631    -0.650041   -0.552645
1   2020-08-13 06:00:00 NaN NaN NaN NaN
2   2020-08-13 12:00:00 NaN NaN NaN NaN
3   2020-08-13 18:00:00 NaN NaN NaN NaN
4   2020-08-14 00:00:00 0.676321    0.214109    -1.312289   -1.020344
  

Как мне принудительно свернуть время и, таким образом, избавиться от всех nan?

Ответ №1:

 resampled_df = df_deltas[['precip','temp']].resample('24h').agg({'precip':'sum','temp':'mean'})
  

вам нужно, чтобы все серии в df имели одинаковый индекс

вы могли бы вместо этого сделать что-то вроде

 interesting_cols = [c for c in df_deltas.columns if "precip" in c or "temp" in c]
aggs = {c:'sum' if 'precip' in c else 'mean' for c in interesting_cols}
df_deltas[columns].resample('24h').agg(aggs)
  

Комментарии:

1. Точные названия столбцов действительно длинные (на основе имени из импортированных данных). Есть ли способ изменить этот ответ для того, как я его изначально написал, где он ищет эти столбцы с определенной строкой в них, а затем выполняет операцию?