我有一个格式如下的文件:
(年 - 月 - 日 - 数据)
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绘图,并能够看到多年来的趋势。如果无论如何在循环中使用子集,那么我可以完成这个吗?
答案 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