groupby Дата год-месяц

#python #pandas

#python #панды

Вопрос:

Я считываю и преобразую данные, используя следующий код

 import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as dates
import numpy as np

df = pd.read_csv('data/C2A2_data/BinnedCsvs_d400/fb441e62df2d58994928907a91895ec62c2c42e6cd075c2700843b89.csv', parse_dates=['Date'])
df.drop('ID', axis='columns', inplace = True)

df_min = df[(df['Date']<='2014-12') amp; (df['Date']>='2004-01') amp; (df['Element']=='TMIN')]
df_min.drop('Element', axis='columns', inplace = True)
df_min = df_min.groupby('Date').agg({'Data_Value': 'min'}).reset_index()
 

дает следующий результат

         Date  Data_Value
0 2005-01-01         -56
1 2005-01-02         -56
2 2005-01-03           0
3 2005-01-04         -39
4 2005-01-05         -94
 

Теперь я пытаюсь получить дату в год-месяц. Итак

         Date  Data_Value
0 2005-01         -94
1 2005-02         xx
2 2005-03         xx
3 2005-04         xx
4 2005-05         xx
 

Где xx — минимальное значение для этого года-месяца.

как мне изменить функцию Groupby или это невозможно с помощью этой функции?

Ответ №1:

Используйте pd.Grouper() для накопления по годовым / ежемесячным / ежедневным частотам.

Код

 df_min["Date"] = pd.to_datetime(df_min["Date"])
df_ans = df_min.groupby(pd.Grouper(key="Date", freq="M")).min()
 

Результат

 print(df_ans)
            Data_Value
Date                  
2005-01-31         -94
 

Ответ №2:

Вы можете сначала сопоставить столбец даты, чтобы получить только год и месяц, а затем просто выполнить groupby и получить минимальное значение для каждой группы:

 # import libraries
import pandas as pd
 
 # test data
data = [['2005-01-01', -56],['2005-01-01', -3],['2005-01-01', 6],
['2005-01-01', 26],['2005-01-01', 56],['2005-02-01', -26],
['2005-02-01', -2],['2005-02-01', 6],['2005-02-01', 26],
['2005-03-01', 56],['2005-03-01', -33],['2005-03-01', -5],
['2005-03-01', 6],['2005-03-01', 26],['2005-03-01', 56]]

# create dataframe
df_min = pd.DataFrame(data=data, columns=["Date", "Date_value"])

# convert 'Date' column to datetime datatype
df_min['Date'] = pd.to_datetime(df_min['Date'])
 
 # get only year and month
df_min['Date'] = df_min['Date'].map(lambda x: str(x.year) '-' str(x.month))

# get min value for each group
df_min = df_min.groupby('Date').min()
 

После печати df_min вывод должен быть:

     Date_value
Date    
2005-01-01  -56
2005-02-01  -26
2005-03-01  -33