我有一个列 Date_Time,我希望按日期时间分组,而不创建一个新的列。这是否可能,我目前的代码不工作。
Date_Time
df = pd.groupby(df,by=[df['Date_Time'].date()])
你可以按 Date_Time列的日期和 dt.date列的日期使用 groupby:
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的另一个解决方案是:
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
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
'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()