理解Pandas中日期时间的重新采样

3

我有一个关于数据框重新采样的问题。

import pandas as pd
df = pd.DataFrame([['2005-01-20', 10], ['2005-01-21', 20], 
                   ['2005-01-27', 40], ['2005-01-28', 50]],
                   columns=['date', 'num'])

# Convert the column to datetime 
df['date'] = pd.to_datetime(df['date'])

# Resample and aggregate results by week
df = df.resample('W', on='date')['num'].sum().reset_index()

print(df.head())
# OUTPUT: 
#         date  num
# 0 2005-01-23   30
# 1 2005-01-30   90 

一切都按预期运行,但我希望更好地理解这里的resample()['num']sum()到底是做什么。

问题 #1

为什么会发生以下情况:

df.resample('W', on='date')的结果是DatetimeIndexResampler

df.resample('W', on='date')['num']的结果是pandas.core.groupby.SeriesGroupBy

df.resample('W', on='date')['num'].sum()的结果是

date
2005-01-23    30
2005-01-30    90
Freq: W-SUN, Name: num, dtype: int64

问题 #2

是否有一种方法可以在不重新采样的情况下产生相同的结果?例如,使用 groupby

1个回答

3

答案1

  1. 根据文档.resample返回一个Resampler对象。因此,由于date是日期时间对象,所以您会得到DatetimeIndexResampler

  2. 现在,您会得到<pandas.core.groupby.SeriesGroupBy,因为您正在寻找基于Resampler对象从数据帧中获取Series

    顺便提一下,

    df.groupby([pd.Grouper(key='date', freq='W-SUN')])['num']也将返回<pandas.core.groupby.SeriesGroupBy

  3. 现在,当您执行.sum()时,您将获得数据帧请求轴上的总和。您得到一个Series,因为您正在计算pandas.core.series.Series的总和。

答案2

您可以使用groupby结合Grouper来实现以下结果:

df.groupby([pd.Grouper(key='date', freq='W-SUN')])['num'].sum()

输出:

date
2005-01-23    30
2005-01-30    90
Name: num, dtype: int64

谢谢您的回复!在第2步中,我们是否检索了之前按“日期”分组的列?如果我们检索多个列,不仅仅是“num”,我们可以为不同的列使用不同的聚合方法,比如“sum()”和“mean()”吗? - Konstantin
1
@Konstantin,是的,你可以拥有任意数量的列。应用 .sum().mean()。例如,如果你有另外一列名为 val。你可以使用 df.resample('W', on='date')[['num', 'val']].sum() 来获取这两列的总和。 - harvpan
但是是否可能对其中一个使用.sum(),而对另一个使用.mean()呢? - Konstantin
1
@Konstantin,当然可以。https://dev59.com/kmUq5IYBdhLWcg3wY_ka - harvpan
@Konstantin 很高兴能帮助你。祝你编程愉快。 - harvpan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接