使用 datetime 数据按日期分组

我有一个列 Date_Time,我希望按日期时间分组,而不创建一个新的列。这是否可能,我目前的代码不工作。

df = pd.groupby(df,by=[df['Date_Time'].date()])
162742 次浏览

你可以按 Date_Time列的日期和 dt.date列的日期使用 groupby:

df = df.groupby([df['Date_Time'].dt.date]).mean()

样本:

df = pd.DataFrame({'Date_Time': pd.date_range('10/1/2001 10:00:00', periods=3, freq='10H'),
'B':[4,5,6]})


print (df)
B           Date_Time
0  4 2001-10-01 10:00:00
1  5 2001-10-01 20:00:00
2  6 2001-10-02 06:00:00


print (df['Date_Time'].dt.date)
0    2001-10-01
1    2001-10-01
2    2001-10-02
Name: Date_Time, dtype: object


df = df.groupby([df['Date_Time'].dt.date])['B'].mean()
print(df)
Date_Time
2001-10-01    4.5
2001-10-02    6.0
Name: B, dtype: float64

resample的另一个解决方案是:

df = df.set_index('Date_Time').resample('D')['B'].mean()


print(df)
Date_Time
2001-10-01    4.5
2001-10-02    6.0
Freq: D, Name: B, dtype: float64

resample

df.resample('D', on='Date_Time').mean()


B
Date_Time
2001-10-01  4.5
2001-10-02  6.0

Grouper

正如@JosephCottam 所建议的

df.set_index('Date_Time').groupby(pd.Grouper(freq='D')).mean()


B
Date_Time
2001-10-01  4.5
2001-10-02  6.0

不推荐使用 TimeGrouper

可以将索引设置为 'Date_Time'并使用 pd.TimeGrouper

df.set_index('Date_Time').groupby(pd.TimeGrouper('D')).mean().dropna()


B
Date_Time
2001-10-01  4.5
2001-10-02  6.0
df.groupby(pd.Grouper(key='Date_Time', axis=0, freq='M')).sum()
  • M 代表月份
  • Y 代表年份
  • D 代表白天