Python - 按月汇总并计算平均值

时间:2014-05-25 20:50:49

标签: python date csv pandas aggregate

我有一个看起来像这样的csv:

Date,Sentiment
2014-01-03,0.4
2014-01-04,-0.03
2014-01-09,0.0
2014-01-10,0.07
2014-01-12,0.0
2014-02-24,0.0
2014-02-25,0.0
2014-02-25,0.0
2014-02-26,0.0
2014-02-28,0.0
2014-03-01,0.1
2014-03-02,-0.5
2014-03-03,0.0
2014-03-08,-0.06
2014-03-11,-0.13
2014-03-22,0.0
2014-03-23,0.33
2014-03-23,0.3
2014-03-25,-0.14
2014-03-28,-0.25
etc

我的目标是按月汇总日期并计算月平均值。日期可能不是从1月或1月开始。问题是我有很多数据,这意味着我有更多年。为了这个目的,我想找到最快的日期(月),并从那里开始计算月数和他们的平均值。例如:

Month count, average
1, 0.4 (<= the earliest month)
2, -0.3
3, 0.0
...
12, 0.1
13, -0.4 (<= new year but counting of month is continuing)
14, 0.3

我使用Pandas打开csv

data = pd.read_csv("pks.csv", sep=",")

所以在data['Date']我有约会,data['Sentiment']我有价值观。知道怎么做吗?

2 个答案:

答案 0 :(得分:4)

可能最简单的方法是使用resample命令。首先,当您读入数据时,请确保解析日期并将日期列设置为索引(忽略StringIO部分和标题= True ...我正在读取您的样本数据line string):

>>> df = pd.read_csv(StringIO(data),header=True,parse_dates=['Date'],
                     index_col='Date')
>>> df

            Sentiment
Date
2014-01-03       0.40
2014-01-04      -0.03
2014-01-09       0.00
2014-01-10       0.07
2014-01-12       0.00
2014-02-24       0.00 
2014-02-25       0.00
2014-02-25       0.00
2014-02-26       0.00
2014-02-28       0.00
2014-03-01       0.10
2014-03-02      -0.50
2014-03-03       0.00
2014-03-08      -0.06
2014-03-11      -0.13
2014-03-22       0.00
2014-03-23       0.33
2014-03-23       0.30
2014-03-25      -0.14
2014-03-28      -0.25


>>> df.resample('M',how='mean')

            Sentiment
2014-01-31      0.088
2014-02-28      0.000
2014-03-31     -0.035

如果您想要一个月份计数器,可以在resample

之后添加
>>> agg = df.resample('M',how='mean')
>>> agg['cnt'] = range(len(agg))
>>> agg

            Sentiment  cnt
2014-01-31      0.088    0
2014-02-28      0.000    1
2014-03-31     -0.035    2

您也可以使用groupby方法和TimeGrouper函数(按月分组,然后调用groupby提供的平均便捷方法)来执行此操作。

>>> df.groupby(pd.TimeGrouper(freq='M')).mean()

            Sentiment
2014-01-31      0.088
2014-02-28      0.000
2014-03-31     -0.035

答案 1 :(得分:0)

要获得当数据框的每日数据行为“情感”时该数据框的月平均值,我将:

  1. 将日期为df['dates']的列转换为DataFrame df的索引:df.set_index('date',inplace=True)
  2. 然后我将索引dates转换为月索引:df.index.month
  3. 最后,我将计算数据框的均值按月份分组df.groupby(df.index.month).Sentiment.mean()

我慢慢地把每一步扔到这里:

具有日期和值的Generation DataFrame

  • 您需要首先导入Pandas和Numpy以及模块datetime

    from datetime import datetime
    
  • 在2019年1月1日至2019年5月3日之间以“ W”周的间隔生成一列'date'。还有一列'Sentiment',其随机值介于1到100之间:

    date_rng = pd.date_range(start='1/1/2018', end='3/05/2018', freq='W')
    df = pd.DataFrame(date_rng, columns=['date'])
    df['Sentiment']=np.random.randint(0,100,size=(len(date_rng)))
    
  • df有两列'date''Sentiment'

            date  Sentiment
    0 2018-01-07         34
    1 2018-01-14         32
    2 2018-01-21         15
    3 2018-01-28          0
    4 2018-02-04         95
    5 2018-02-11         53
    6 2018-02-18          7
    7 2018-02-25         35
    8 2018-03-04         17
    

    'date'列设置为DataFrame的索引:

    df.set_index('date',inplace=True)
    
  • df有一列'Sentiment',索引是'date'

                Sentiment
    date                 
    2018-01-07         34
    2018-01-14         32
    2018-01-21         15
    2018-01-28          0
    2018-02-04         95
    2018-02-11         53
    2018-02-18          7
    2018-02-25         35
    2018-03-04         17
    

从索引中获取月份号

    months=df.index.month

获得按月分组的每个月的平均值:

    monthly_avg=df.groupby(months).Sentiment.mean()

按月份'monthly_avg'划分的数据集的平均值为:

    date
    1    20.25
    2    47.50
    3    17.00