Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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中计算不含29.02的每日平均值_Python_Numpy_Datetime - Fatal编程技术网

时间序列-在python中计算不含29.02的每日平均值

时间序列-在python中计算不含29.02的每日平均值,python,numpy,datetime,Python,Numpy,Datetime,问题是关于日平均值。我的降雨量列表(mm)如下所示 Y = [ 22, 29, 4, 7, 10, 3, ...] X是时间序列 X= [datetime.date(1991, 1, 1), datetime.date(1991, 1, 2), datetime.date(1991, 1, 3), ... datetime.date(2017, 12, 13), datetime.date(2017, 12, 14), datetime.date

问题是关于日平均值。我的降雨量列表(mm)如下所示

Y = [ 22,
    29,
    4,
    7,
    10,
    3,
    ...]
X是时间序列

X= [datetime.date(1991, 1, 1),
datetime.date(1991, 1, 2),
datetime.date(1991, 1, 3),
...
datetime.date(2017, 12, 13),
datetime.date(2017, 12, 14),
datetime.date(2017, 12, 15),]
X和Y的长度相同。我可以用它来画它

我想计算列表中的日平均值,但在每个列表中跳过29.02天 闰年(因此平均列表长度为365), 也考虑不完整年(例如,在这个问题中只有11个月和15天在2017),所以新的列表(假设z)看起来像这个< /P>
Z = [ 28,
     19,
     ...
     20]

and len(Z) = 365

有人有聪明的方法来解决这个问题吗?我尝试的方式总是冗长而愚蠢。提前衷心感谢您。

pandas
TimeSeries具有该功能

更新4
按日期计算的年平均数

更新3

#fixed bug in leap dates
更新2从计算中删除所有2月29日

使用问题中的数据更新1

如果您确定Y具有自1991年1月1日以来的所有天数的值,则

Y = [ 22,29,4]
df = pd.DataFrame(Y, 
        index = pd.date_range('01.01.1991',periods = len(Y),freq ='D', name = 'date'),
        columns = ['rainfall'])
df
输出:

date    rainfall
1991-01-01  22
1991-01-02  29
1991-01-03  4
            rainfall
date                
2000-02-28      86.0
2000-02-29       NaN
2000-03-01      83.0
 month  day rainfall
 1  1   49.75
 1  2   53.96296296296296
 #.......................
 12 30  48.666666666666664
 12 31  57.48148148148148
若要删除所有02-29,请设置它们
np.NaN
,这将从计算中排除它们

leap_y = pd.Timestamp('29.02.1992') + pd.to_timedelta(1461*np.arange(7),'D')

df.loc[leap_y,'rainfall']=np.NaN
print(df['2000-02-28':'2000-03-01'])
输出:

date    rainfall
1991-01-01  22
1991-01-02  29
1991-01-03  4
            rainfall
date                
2000-02-28      86.0
2000-02-29       NaN
2000-03-01      83.0
 month  day rainfall
 1  1   49.75
 1  2   53.96296296296296
 #.......................
 12 30  48.666666666666664
 12 31  57.48148148148148
年平均日数

anual = df.groupby([df.index.month.rename('month'),
                    df.index.day.rename('day')]).mean().dropna()
anual
输出:

date    rainfall
1991-01-01  22
1991-01-02  29
1991-01-03  4
            rainfall
date                
2000-02-28      86.0
2000-02-29       NaN
2000-03-01      83.0
 month  day rainfall
 1  1   49.75
 1  2   53.96296296296296
 #.......................
 12 30  48.666666666666664
 12 31  57.48148148148148

共享数据和代码。请看这里:在
Y
1991年1月1日,你每天有一件物品?@AntonvBR我已经更正了,谢谢你的友好提醒。@Ilitimofev Yes或者你的想法是放弃所有2月29日的计算,假装在那个月只有28天?前半部分非常有用,但最后我想计算一年中的日平均值(所以平均值为01.01,平均值为02.01,平均值为03.01…等等),这样一个新列表将包含365个数据,每个数据都是平均值。现在我理解了你的问题:)你可以得到闰年2月29日的正确年平均值,只需跳过
df[leap\u y]=np.NaN
非常感谢!多么简洁有力:D