Python Pandas 使用日期时间数据按日期分组

Posted

技术标签:

【中文标题】Python Pandas 使用日期时间数据按日期分组【英文标题】:Python Pandas Group by date using datetime data 【发布时间】:2017-01-16 22:16:34 【问题描述】:

我有一个列Date_Time,我希望在不创建新列的情况下按日期时间分组。这可能是我当前的代码不起作用。

df = pd.groupby(df,by=[df['Date_Time'].date()])

【问题讨论】:

【参考方案1】:

您可以使用groupby by 列Date_Time by dt.date 的日期:

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

【讨论】:

【参考方案2】:

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

【讨论】:

这太棒了!我如何防止它添加没有数据的日期?例如,如果我有 9/1、9/2 和 9/4 天的数据,它仍然有 9/3 和 NaN 值。 @GoBlue_MathMan 使用.dropna() TimeGrouper 已被弃用。您能否更新您的答案以改用pd.Grouper(freq='D') @JosephCottam 你去。如果这对你有用,请告诉我。 这里,当按“小时”分组时,它会将源文件中不存在的小时添加为零值。

以上是关于Python Pandas 使用日期时间数据按日期分组的主要内容,如果未能解决你的问题,请参考以下文章

Python pandas根据日期范围按升序过滤数据

Pandas日期数据处理:如何按日期筛选显示及统计数据

Python数据分析pandas日期范围date_range

Python Pandas:按日期分组,并按时间戳访问每个组

使用 pandas 数据框按时间顺序转换日期

在Python中按日期对excel文件进​​行排序[关闭]