了解重新采样pandas中的datetime

时间:2018-05-23 15:33:55

标签: pandas dataframe

我有关于重新采样DataFrame的问题。

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 个答案:

答案 0 :(得分:2)

<强>正确答案为

  1. 正如docs所说,.resample会返回Resampler个对象。因此,您获得DatetimeIndexResampler因为date是日期时间对象。

  2. 现在,您获得<pandas.core.groupby.SeriesGroupBy,因为您正在根据Series对象从数据框中查找Resampler

    哦顺便说一句,

    df.groupby([pd.Grouper(key='date', freq='W-SUN')])['num'] 会回来 <pandas.core.groupby.SeriesGroupBy也是如此。

  3. 现在,当您执行.sum()时,您将获得所请求的数据帧轴的总和。您得到的是Series,因为您对pandas.core.series.Series进行了总结。

  4. <强> ANSWER2

    您可以在Grouper的帮助下使用groupby获得结果,如下所示:

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

    输出:

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