Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 每小时timeseries上某列的平均值_Python_Pandas_Group By_Time Series_Python Datetime - Fatal编程技术网

Python 每小时timeseries上某列的平均值

Python 每小时timeseries上某列的平均值,python,pandas,group-by,time-series,python-datetime,Python,Pandas,Group By,Time Series,Python Datetime,我有一个非常长的小时值列表(10年),我想平均每天第3列。这样,每个日期将有一个从第三列导出的平均值 我的数据如下所示: > 1/1/2005,16:00:00,83.3971,-3.8950 > 1/1/2005,17:00:00,0.0000,-3.9146 > 1/1/2005,18:00:00,0.0000,-3.9337 > 1/1/2005,19:00:00,0.0000,-3.9532 > 1/1/2005,20

我有一个非常长的小时值列表(10年),我想平均每天第3列。这样,每个日期将有一个从第三列导出的平均值

我的数据如下所示:

>     1/1/2005,16:00:00,83.3971,-3.8950
>     1/1/2005,17:00:00,0.0000,-3.9146
>     1/1/2005,18:00:00,0.0000,-3.9337
>     1/1/2005,19:00:00,0.0000,-3.9532
>     1/1/2005,20:00:00,0.0000,-3.9727
>     1/1/2005,21:00:00,0.0000,-3.9920
>     1/1/2005,22:00:00,0.0000,-4.0116
>     1/1/2005,23:00:00,0.0000,-4.0311
>     1/2/2005,0:00:00,0.0000,-4.0503
>     1/2/2005,1:00:00,0.0000,-4.0697
>     1/2/2005,2:00:00,0.0000,-4.0891
>     1/2/2005,3:00:00,0.0000,-4.1083
>     1/2/2005,4:00:00,0.0000,-4.1279
>     1/2/2005,5:00:00,0.0000,-4.1472
>     1/2/2005,6:00:00,0.0000,-4.1662
>     1/2/2005,7:00:00,0.0000,-4.1858
>     1/2/2005,8:00:00,0.0000,-4.2053
>     1/2/2005,9:00:00,152.7058,-4.2242
>     1/2/2005,10:00:00,302.6400,-4.2436
>     1/2/2005,11:00:00,405.2218,-4.2630
>     1/2/2005,12:00:00,452.6208,-4.2821
>     1/2/2005,13:00:00,441.4662,-4.3016
>     1/2/2005,14:00:00,372.5459,-4.3208
>     1/2/2005,15:00:00,250.8291,-4.3398
>     1/2/2005,16:00:00,86.6172,-4.3592
>     1/2/2005,17:00:00,0.0000,-4.3785
>     1/2/2005,18:00:00,0.0000,-4.3973
>     1/2/2005,19:00:00,0.0000,-4.4167
>...

这可能是一个突出前提和简单案例使用的绝佳机会

也许将csv读入pandas,将索引作为datetime对象,然后按天分组,合计总和/除以计数(又称平均值

问题: 我需要平均每日值,我从以上10年的每小时时间序列开始。如中所示,我有一个从2005年1月1日到2014年12月31日的每小时数据集,我需要基于该数据集的10年每日平均值的平均每日值。你懂吗

我已经从每小时使用改为每天使用:

df = pd.read_csv('file.csv', parse_dates='datetime':0,1]},index_col='datetime', header=True, usecols=[0,1,2])

day_avgs = df.groupby(pd.TimeGrouper('D'))
这将返回平均每日值,请参见以下内容:

date  

2005-01-01  106.307291
2005-01-02  102.578729
2005-01-03  103.332883
2005-01-04  104.139979
2005-01-05  104.999592
... ...
2014-12-02  108.292092
2014-12-03  107.189729
2014-12-04  106.142721
2014-12-05  105.151696
然而,我很难理解如何在“day_avgs”中对这些每日值进行分组,因此在每个日期(其中10个)进行分组,然后平均得出一个每日平均值,即10年数据集中所有这些单独日期的平均值。卡皮奇

也就是说,我希望根据10年的每日平均值计算一年中每天的平均值(365)。

查找一年中每天的平均值 输出 它假设所有小时值在不同年份具有相同的权重

找出每个日期的平均值
pandas
允许索引中存在重复值

按日期(第1列)对数据进行分组,并找出第3列的平均值:

#!/usr/bin/env python
import pandas

df = pandas.read_csv('input.csv', parse_dates=True, index_col=0,
                     usecols=[0,2], names=['date', 'value'])
print(df.groupby(level=0).mean())
输出 使用
itertools.groupby()
的代码会产生相同的结果:

#!/usr/bin/env python
import csv
from collections import OrderedDict
from datetime import datetime
from itertools import groupby
from operator import itemgetter
from pprint import pprint

def groupby_mean(file):
    mean = OrderedDict()
    for day, same_day_rows in groupby(csv.reader(file), key=itemgetter(0)):
        L = [float(row[2]) for row in same_day_rows]
        mean[datetime.strptime(day, '%m/%d/%Y')] = sum(L) / len(L)
    return mean

with open('input.csv') as file:
    pprint(groupby_mean(file))
输出
math.fsum(L)
与您输入的
sum(L)
结果相同。

为什么要除以8?你有额外的8个观察结果,你是否想将0.0000的值打折扣?因此,你的问题有很多问题,这是不鼓励的,因此,理想情况下,每个帖子1个问题,因此你需要编辑你的问题。我的问题只有一个,但毫无疑问,这是有步骤的。我可以处理一天的平均值,包括零,或者不包括,任何对受访者来说最简单的事情。-8只是平均计算的一个例子。我认为这个问题(同样,只有1个)不值得编辑,因为我相信答案将大大有助于帮助他人。谢谢,但不完全是,但这是我的错,因为我解释得不够清楚。我的问题已经更新了。@geocrowding:让我们简化一下。我的代码使用您问题中的数据。它产生两行。你认为这些数据会有什么结果?我认为问题很清楚。数据是10年,不是一年。很抱歉,您的方法无法对此提供答案。另外,level=0在使用我的数据时不起作用,所以不确定它是如何对您起作用的。我通过上面编辑的代码完成了同样的任务。感谢您的尝试,请放心再进一步,只需平均所有的平均天数……这就是问题所在,很简单。@geocrowding:您的输入数据只跨越两天。你改变了问题。所有代码都经过测试。它可以在Python2和Python3上工作
pandas.\uuuuuu版本\uuuuu
0.13.1
。我没有改变这个问题,但我更好地限定了它。我认为在这篇文章中包含10年的小时价值是不可取的。我最好通过实际陈述其长度——10年并在末尾添加“…”来限定我的“非常长的列表”陈述。我希望这能消除任何误解。如果您仍然不清楚,请参考后一个数据样本,其中包括数据集的开头和结尾。
            value
date             
01-01  143.991035
01-02  123.232340
12-30    0.000000
12-31  100.981233
#!/usr/bin/env python
import pandas

df = pandas.read_csv('input.csv', parse_dates=True, index_col=0,
                     usecols=[0,2], names=['date', 'value'])
print(df.groupby(level=0).mean())
                 value
date                  
2005-01-01  143.991035
2005-01-02  123.232340

[2 rows x 1 columns]
#!/usr/bin/env python
import csv
from collections import OrderedDict
from datetime import datetime
from itertools import groupby
from operator import itemgetter
from pprint import pprint

def groupby_mean(file):
    mean = OrderedDict()
    for day, same_day_rows in groupby(csv.reader(file), key=itemgetter(0)):
        L = [float(row[2]) for row in same_day_rows]
        mean[datetime.strptime(day, '%m/%d/%Y')] = sum(L) / len(L)
    return mean

with open('input.csv') as file:
    pprint(groupby_mean(file))
{datetime.datetime(2005, 1, 1, 0, 0): 143.99103529411764,
 datetime.datetime(2005, 1, 2, 0, 0): 123.23234}