Python pandas - 平均 10 分钟测量到 15 分钟平均值和 60 分钟平均值,具体取决于数据差距的长度

标签 python pandas mean na

我是 pyhton 编程的新手,我希望你们中的任何人有心情帮助我。

嗯,我有许多不同的气候站,可以在 1 分钟和 10 分钟的时间分辨率内测量太阳辐射。测量值还包含 Na 值。 现在我想用 15 分钟和 60 分钟的时间分辨率计算平均值,但应该考虑到数据间隙的长度。如果底层时间跨度中的数据差距大于此时间跨度中可用值的相对数量(例如 20%),则不采取任何其他措施来构建平均值。 例如: - 12 点的每小时平均值应该是 NA,因为在基础时间跨度中有 50% 的 NA

09.08.2011 11:10    553
09.08.2011 11:20    567   
09.08.2011 11:30    NA
09.08.2011 11:40    NA
09.08.2011 11:50    NA
09.08.2011 12:00    NA
  • 1 点的平均值应该是 NA,因为 100% NA(见下面的数据示例)

  • 2 点钟的平均值应该是 210.6,因为基础小时只有 16.7% NA

我的数据是这样的:

09.08.2011 10:00    189       
09.08.2011 10:10    337       
09.08.2011 10:20    567       
09.08.2011 10:30    432       
09.08.2011 10:40    634       
09.08.2011 10:50    965       
09.08.2011 11:00    897       
09.08.2011 11:10    553       
09.08.2011 11:20    567       
09.08.2011 11:30    NA       
09.08.2011 11:40    NA       
09.08.2011 11:50    NA   
09.08.2011 12:00    NA   
09.08.2011 12:20    NA   
09.08.2011 12:30    NA
09.08.2011 12:40    NA
09.08.2011 12:50    NA
09.08.2011 13:00    NA
09.08.2011 13:10    NA
09.08.2011 13:20    445
09.08.2011 13:30    115
09.08.2011 13:40    34
09.08.2011 13:50    128
09.08.2011 14:00    331


import pandas as pd
import numpy as np

df_csv_data = pd.io.parsers.read_csv(station_path, skiprows=5,  parse_dates= True, index_col=0, na_values=[-999], names= names_header , sep=' ', header=None , squeeze=True)

ts15 = df_csv_data.resample('15Min', how='mean')
ts60 = df_csv_data.resample('60Min', how='mean')

我想通过不同所需时间分辨率导致的相对数量的数据间隙来解决这个问题。

有没有人有解决这个问题的想法?

非常感谢!

史蒂夫

`

最佳答案

# Setup problem
import pandas as pd
import numpy as np

num_samples = 100
s = pd.Series(np.random.randint(0, 500, num_samples), index=pd.date_range('03/06/2015', periods=num_samples, freq='10min'))
mask = np.random.rand(num_samples) < .7
s[mask] = np.nan

# Loop through index
# Note the perc_nan variable can be changed depending on what percentage of the interval must be nan for the mean value to also be nan
perc_nan = 0.5
data, indices = [], []
for dt in s.index:
    if dt.minute == 0:
        d = s[('00:00:00' <= dt - s.index) & (dt - s.index < '01:00:00')]
        data.append(d.mean() if d.isnull().sum() <= len(d)*perc_nan else np.nan)
        indices.append(dt)

# Solution
pd.Series(data, index=indices)

关于Python pandas - 平均 10 分钟测量到 15 分钟平均值和 60 分钟平均值,具体取决于数据差距的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28901948/

相关文章:

c++ - 通过函数传递数组

python - 如何检查文件是否是Python中的符号链接(symbolic link)?

python - 在python中使用selenium获取特定div的HTML代码

python - Pandas 数据透视多索引表,无聚合

python - np.where np.nan 的处理(NaN 评估为值 < 0)

python-3.x - 如何将SEC txt文件读入 Pandas 数据框?

python - numpy 的每日平均值

python - 根据相似的两列对 pandas 数据框进行排序,但如果另一列具有值,则其中一列将为 NaN

python - 文件夹上的备用数据流

r - 当每个条件的总数不同时计算平均值