Python pandas - 根据数据间隙的长度,将 10 分钟的测量值平均为 15 分钟的平均值和 60 分钟的平均值
Python pandas - averaging 10 min measurements to 15min mean and 60min mean depending on the length of the data gap
我是 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)
我是 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)