如何通过日期和时间对Pandas DataFrame进行分组
在这篇文章中,我们将讨论如何在Pandas中根据日期和时间对DataFrame进行分组。我们将看到通过年、月、日等对时间序列DataFrame进行分组的方法。此外,我们还将看到按时间对象分组的方法,如分钟。
Pandas GroupBy允许我们为一个对象指定一个groupby指令。这个指定的指令将通过grouper函数的key参数以及level和/或axis参数(如果给定的话)来选择一个列,目标对象/列的索引的level。
语法: pandas.Grouper(key=None, level=None, freq=None, axis=0, sort=False)
下面是一些例子,描述了如何使用pandas Grouper类在日期和时间的基础上对DataFrame进行分组。
例子1:按月分组
# importing modules
import pandas as pd
# creating a dataframe df
df = pd.DataFrame(
{
"Date": [
pd.Timestamp("2000-11-02"),
pd.Timestamp("2000-01-02"),
pd.Timestamp("2000-01-09"),
pd.Timestamp("2000-03-11"),
pd.Timestamp("2000-01-26"),
pd.Timestamp("2000-02-16")
],
"ID": [1, 2, 3, 4, 5, 6],
"Price": [140, 120, 230, 40, 100, 450]
}
)
# show df
display(df)
# applying the groupby function on df
df.groupby(pd.Grouper(key='Date', axis=0,
freq='M')).sum()
输出:
在上面的例子中,DataFrame是按日期列分组的。由于我们提供了freq=’M’,意思是月,所以数据被按月分组,直到每个月的最后一天,并提供价格列的总和。我们没有提供所有月份的数值,那么groupby函数也会显示所有月份的数据,并为其他月份分配数值0。
例子2:按天数分组
# importing modules
import pandas as pd
# creating a dataframe df
df = pd.DataFrame(
{
"Date": [
pd.Timestamp("2000-11-02"),
pd.Timestamp("2000-01-02"),
pd.Timestamp("2000-01-09"),
pd.Timestamp("2000-03-11"),
pd.Timestamp("2000-01-26"),
pd.Timestamp("2000-02-16")
],
"ID": [1, 2, 3, 4, 5, 6],
"Price": [140, 120, 230, 40, 100, 450]
}
)
# display dataframe
display(df)
# applying groupby
df.groupby(pd.Grouper(key='Date', axis=0,
freq='2D', sort=True)).sum()
输出:
在上面的例子中,DataFrame是按日期列分组的。由于我们提供了freq = ‘5D’,这意味着5天,所以数据按每月5天的时间间隔分组,直到日期列中给出的最后日期。
例子3:按年份分组
# importing module
import pandas as pd
# creating dataframe with datetime
df = pd.DataFrame(
{
"Date": [
# here the date contains
# different years
pd.Timestamp("2010-11-02"),
pd.Timestamp("2011-01-02"),
pd.Timestamp("2013-01-09"),
pd.Timestamp("2014-03-11"),
pd.Timestamp("2015-01-26"),
pd.Timestamp("2012-02-16")
],
"ID": [1, 2, 3, 4, 5, 6],
"Price": [140, 120, 230, 40, 100, 450]
}
)
# show df
display(df)
# applying groupby function
df.groupby(pd.Grouper(key='Date', freq='2Y')).sum()
输出:
在上面的例子中,DataFrame是按日期列分组的。由于我们提供了freq = ‘2Y’,这意味着2年,所以数据被分组在2年的时间间隔内。
例子4:按分钟分组
# importing module
import pandas as pd
# create an array of 5 dates starting
# at '2015-02-24', one per minute
dates = pd.date_range('2015-02-24', periods=10, freq='T')
# creating dataframe with above array
# of dates
df = pd.DataFrame({"Date": dates, "ID": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
"Price": [140, 120, 230, 40, 100, 450, 234, 785, 12, 42]})
# display dataframe
display(df)
# applied groupby function
df.groupby(pd.Grouper(key='Date', freq='2min')).sum()
输出:
在上面的例子中,数据是以每2分钟的间隔分组的。