我怎么能在python中获得每日平均值?

时间:2017-10-24 17:51:26

标签: python numpy matplotlib

我有一个格式如下的文件:

(年 - 月 - 日 - 数据)

1980 - 1 - 1 - 1.2
1980 - 1 - 2 - 1.3
1980 - 1 - 3 - 1.4
1980 - 1 - 4 - 1.5
1980 - 1 - 5 - 1.6
1980 - 1 - 6 - 1.7
1980 - 1 - 7 - 1.8

它是一个numpy数组。这是大约24年的数据,所以我希望能够做到的是每天的平均值,并把它放入一个单独的1D阵列,只有366(闰年)的平均值,我可以然后使用matplotlib绘图,并能够看到多年来的趋势。如果无论如何在循环中使用子集,那么我可以完成这个吗?

2 个答案:

答案 0 :(得分:3)

使用熊猫绝对是可行的方法。至少有两种方法可以按“一年中的某一天”进行分组,您可以将一年中的数字日作为字符串或字符串monthday组合,如下所示:

import pandas as pd
import numpy as np

df = pd.DataFrame(index=pd.date_range('2000-01-01', '2010-12-31'))

df['vals'] = np.random.randint(1, 6, df.shape[0])

print(df.groupby(df.index.strftime("%j")).mean())
print(df.groupby(df.index.strftime("%m%d")).mean())

答案 1 :(得分:0)

对于任何想要找到替代处理异常输入的方法的人来说,这里都是一些代码。

在其基本要素中,代码一次读取输入文件,选择日期和值的元素,将这些元素重新组合成pandas可以轻松解析并将它们放入StringIO对象的行。

Pandas从那里读取它们,好像来自csv文件。我已经从PiRSquared.

中删除了分组代码
import pandas as pd
import re
from io import StringIO

file_name = 'temp.txt'

for_pd = StringIO()
with open(file_name) as f:
    for line in f:
        pieces = re.search(r'([0-9]{4}) - ([0-9]{,2}) - ([0-9]{,2}) - ([0-9.]+)', line).groups()
        pieces = [int(_) for _ in pieces[:3]] + [pieces[3]]
        print ('%.4i-%.2i-%.2i,%s' % tuple(pieces), file=for_pd)
for_pd.seek(0)

df = pd.read_csv(for_pd, header=None, names=['datetimes', 'values'], parse_dates=['datetimes'])

print (df.set_index('datetimes').groupby(pd.TimeGrouper('D')).mean().dropna())
print (df.set_index('datetimes').groupby(pd.TimeGrouper('W')).mean().dropna())

这是输出。

            values
datetimes         
1980-01-01     1.2
1980-01-02     1.3
1980-01-03     1.4
1980-01-04     1.5
1980-01-05     1.6
1980-01-06     1.7
1980-01-07     1.8
            values
datetimes         
1980-01-06    1.45
1980-01-13    1.80