- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须将数据集从 10 分钟间隔重新采样为 15 分钟间隔,以使其与另一个数据集同步。根据我在 stackoverflow 上的搜索,我有一些如何继续的想法,但没有一个提供干净清晰的解决方案。
问题设置
#%% Import modules
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#%% make timestamps
periods = 12
startdate = '2010-01-01'
timestamp10min = pd.date_range(startdate, freq='10Min', periods=periods)
#%% Make DataFrame and fill it with some data
df = pd.DataFrame(index=timestamp10min)
y = -(np.arange(periods)-periods/2)**2
df['y'] = y
现在我希望 10 分钟处的值保持不变,并且 **:15 和 **:45 处的值是 **:10、**:20 和 ** 的平均值: 40,**:50。问题的核心在于15分钟不是10分钟的整数倍。否则,只需应用 df.resample('10Min', how='mean')
就可以了。
只需使用 15 分钟重采样,并接受引入的小误差。
使用两种形式的重采样,即 close='left', label='left'
和 close='right' , label='right'
。之后我可以对两个重新采样的表格进行平均。结果会给我带来一些结果误差,但比第一种方法要小。
将所有内容重新采样为 5 分钟数据,然后应用滚动平均值。类似的东西在这里应用:Pandas: rolling mean by time interval
使用不同数量的输入重新采样并求平均值:Use numpy.average with weights for resampling a pandas array因此,我必须创建一个具有不同重量长度的新系列。权重应该在 1 和 2 之间交替吗?
将所有内容重新采样为 5 分钟数据,然后应用线性插值。此方法与方法3接近。 Pandas data frame: resample with linear interpolation编辑:@Paul H 给出了一个可行的解决方案,仍然可读。谢谢!
所有的方法都不能真正令我满意。有些方法会导致小错误,而另一些方法对于外人来说很难阅读。
方法 1、2 和 5 的实现以及所需的输出。与可视化相结合。
#%% start plot
plt.figure()
plt.plot(df.index, df['y'], label='original')
#%% resample the data to 15 minutes and plot the result
close = 'left'; label='left'
dfresamplell = pd.DataFrame()
dfresamplell['15min'] = df.y.resample('15Min', how='mean', closed=close, label=label)
labelstring = 'close ' + close + ' label ' + label
plt.plot(dfresamplell.index, dfresamplell['15min'], label=labelstring)
close = 'right'; label='right'
dfresamplerr = pd.DataFrame()
dfresamplerr['15min'] = df.y.resample('15Min', how='mean', closed=close, label=label)
labelstring = 'close ' + close + ' label ' + label
plt.plot(dfresamplerr.index, dfresamplerr['15min'], label=labelstring)
#%% make an average
dfresampleaverage = pd.DataFrame(index=dfresamplell.index)
dfresampleaverage['15min'] = (dfresamplell['15min'].values+dfresamplerr['15min'].values[:-1])/2
plt.plot(dfresampleaverage.index, dfresampleaverage['15min'], label='average of both resampling methods')
#%% desired output
ydesired = np.zeros(periods/3*2)
i = 0
j = 0
k = 0
for val in ydesired:
if i+k==len(y): k=0
ydesired[j] = np.mean([y[i],y[i+k]])
j+=1
i+=1
if k==0: k=1;
else: k=0; i+=1
plt.plot(dfresamplell.index, ydesired, label='ydesired')
#%% suggestion of Paul H
dfreindex = df.reindex(pd.date_range(startdate, freq='5T', periods=periods*2))
dfreindex.interpolate(inplace=True)
dfreindex = dfreindex.resample('15T', how='first').head()
plt.plot(dfreindex.index, dfreindex['y'], label='method Paul H')
#%% finalize plot
plt.legend()
作为奖励,我添加了用于角度插值的代码。这是通过使用复数来完成的。由于复数插值尚未实现,因此我将复数分为实部和虚部。对这些数字进行平均后可以再次转换为天使。对于某些角度,这是比简单地平均两个角度更好的重采样方法,例如:345 度和 5 度。
#%% make timestamps
periods = 24*6
startdate = '2010-01-01'
timestamp10min = pd.date_range(startdate, freq='10Min', periods=periods)
#%% Make DataFrame and fill it with some data
degrees = np.cumsum(np.random.randn(periods)*25) % 360
df = pd.DataFrame(index=timestamp10min)
df['deg'] = degrees
df['zreal'] = np.cos(df['deg']*np.pi/180)
df['zimag'] = np.sin(df['deg']*np.pi/180)
#%% suggestion of Paul H
dfreindex = df.reindex(pd.date_range(startdate, freq='5T', periods=periods*2))
dfreindex = dfreindex.interpolate()
dfresample = dfreindex.resample('15T', how='first')
#%% convert complex to degrees
def f(x):
return np.angle(x[0] + x[1]*1j, deg=True )
dfresample['degrees'] = dfresample[['zreal', 'zimag']].apply(f, axis=1)
#%% set all the values between 0-360 degrees
dfresample.loc[dfresample['degrees']<0] = 360 + dfresample.loc[dfresample['degrees']<0]
#%% wrong resampling
dfresample['deg'] = dfresample['deg'] % 360
#%% plot different sampling methods
plt.figure()
plt.plot(df.index, df['deg'], label='normal', marker='v')
plt.plot(dfresample.index, dfresample['degrees'], label='resampled according @Paul H', marker='^')
plt.plot(dfresample.index, dfresample['deg'], label='wrong resampling', marker='<')
plt.legend()
最佳答案
我可能误解了这个问题,但这有效吗?
import numpy as np
import pandas
data = np.arange(0, 101, 8)
index_10T = pandas.DatetimeIndex(freq='10T', start='2012-01-01 00:00', periods=data.shape[0])
index_05T = pandas.DatetimeIndex(freq='05T', start=index_10T[0], end=index_10T[-1])
index_15T = pandas.DatetimeIndex(freq='15T', start=index_10T[0], end=index_10T[-1])
df1 = pandas.DataFrame(data=data, index=index_10T, columns=['A'])
print(df.reindex(index=index_05T).interpolate().loc[index_15T])
import numpy as np
import pandas
data = np.arange(0, 101, 8)
index_10T = pandas.DatetimeIndex(freq='10T', start='2012-01-01 00:00', periods=data.shape[0])
df1 = pandas.DataFrame(data=data, index=index_10T, columns=['A'])
print(df1)
A
2012-01-01 00:00:00 0
2012-01-01 00:10:00 8
2012-01-01 00:20:00 16
2012-01-01 00:30:00 24
2012-01-01 00:40:00 32
2012-01-01 00:50:00 40
2012-01-01 01:00:00 48
2012-01-01 01:10:00 56
2012-01-01 01:20:00 64
2012-01-01 01:30:00 72
2012-01-01 01:40:00 80
2012-01-01 01:50:00 88
2012-01-01 02:00:00 96
index_05T = pandas.DatetimeIndex(freq='05T', start=index_10T[0], end=index_10T[-1])
df2 = df.reindex(index=index_05T)
print(df2)
A
2012-01-01 00:00:00 0
2012-01-01 00:05:00 NaN
2012-01-01 00:10:00 8
2012-01-01 00:15:00 NaN
2012-01-01 00:20:00 16
2012-01-01 00:25:00 NaN
2012-01-01 00:30:00 24
2012-01-01 00:35:00 NaN
2012-01-01 00:40:00 32
2012-01-01 00:45:00 NaN
2012-01-01 00:50:00 40
2012-01-01 00:55:00 NaN
2012-01-01 01:00:00 48
2012-01-01 01:05:00 NaN
2012-01-01 01:10:00 56
2012-01-01 01:15:00 NaN
2012-01-01 01:20:00 64
2012-01-01 01:25:00 NaN
2012-01-01 01:30:00 72
2012-01-01 01:35:00 NaN
2012-01-01 01:40:00 80
2012-01-01 01:45:00 NaN
2012-01-01 01:50:00 88
2012-01-01 01:55:00 NaN
2012-01-01 02:00:00 96
print(df2.interpolate())
A
2012-01-01 00:00:00 0
2012-01-01 00:05:00 4
2012-01-01 00:10:00 8
2012-01-01 00:15:00 12
2012-01-01 00:20:00 16
2012-01-01 00:25:00 20
2012-01-01 00:30:00 24
2012-01-01 00:35:00 28
2012-01-01 00:40:00 32
2012-01-01 00:45:00 36
2012-01-01 00:50:00 40
2012-01-01 00:55:00 44
2012-01-01 01:00:00 48
2012-01-01 01:05:00 52
2012-01-01 01:10:00 56
2012-01-01 01:15:00 60
2012-01-01 01:20:00 64
2012-01-01 01:25:00 68
2012-01-01 01:30:00 72
2012-01-01 01:35:00 76
2012-01-01 01:40:00 80
2012-01-01 01:45:00 84
2012-01-01 01:50:00 88
2012-01-01 01:55:00 92
2012-01-01 02:00:00 96
index_15T = pandas.DatetimeIndex(freq='15T', start=index_10T[0], end=index_10T[-1])
print(df2.interpolate().loc[index_15T])
A
2012-01-01 00:00:00 0
2012-01-01 00:15:00 12
2012-01-01 00:30:00 24
2012-01-01 00:45:00 36
2012-01-01 01:00:00 48
2012-01-01 01:15:00 60
2012-01-01 01:30:00 72
2012-01-01 01:45:00 84
2012-01-01 02:00:00 96
关于python - Pandas.resample 为非整数倍频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26594464/
我正在尝试对数据框重新采样。首先,我想在结果中保留几个聚合。其次,对特定列有一个额外的感兴趣的聚合。由于此聚合仅与单个列相关,因此可以将重采样器限制在该列上,以免不必要地将聚合应用于其他列。 此场景适
我需要根据月度数据计算年平均值。如果我的月度数据中有 nan 值,我希望全年也为 nan。 这是我到目前为止的代码: station_data = pd.read_csv(station_data_f
我正在尝试使用插入符和 doMC 在 R 中训练 SVM 模型。这是一个可重现的示例: library(mlbench) library(caret) library(doMC) registerDo
我有一个 pandas Timestamp 与日期时间和频率相关联。但是,日期时间似乎与频率无关。例如, >>> t = pd.Timestamp('2018-6-6', freq='W-FRI')
import pandas as pd import os files = os.listdir('D:\\Data\\200 Stocks 1 minute Data') for file in f
所以我想使用填充方法对数据进行下采样 我有一个数据: 2020-01-01 1.248310e+06 2021-01-01 1.259511e+06 2022-01-01 1.276312e+0
我必须将数据集从 10 分钟间隔重新采样为 15 分钟间隔,以使其与另一个数据集同步。根据我在 stackoverflow 上的搜索,我有一些如何继续的想法,但没有一个提供干净清晰的解决方案。 问题
我正在阅读 resample a dataframe with different functions applied to each column? 解决方案是: frame.resample('1
我有一个 pandas 数据框,其中包含不同时间尺度的信息,即在某些时期我每秒有 100 个数据点,而在其他时期我每分钟有 1 个数据点。 我的目标是使用固定时间窗口(例如:1 秒)重新采样此数据帧,
我正在使用 pandas 将存储在 data_m 中的日内数据转换为每日数据。出于某种原因,resample 添加了当天数据中不存在的行。例如,1/8/2000 不在日内数据中,但日数据包含该日期的一
我正在使用 pandas 处理具有某些缺失值的月度数据。我希望能够使用 resample 方法计算年度统计数据,但多年来没有丢失数据。 这里有一些代码和输出来演示: import pandas as
我正在执行一个简单的财务数据示例,试图制作一个经典的烛台图。为此,我必须计算每个时间单位的开盘价、最大值、最小值和收盘价。我决定将 resample 函数与 groupby 一起使用(针对每个符号)。
下面是一个例子: # Generate some random time series dataframe with 'price' and 'volume' x = pd.date_range('2
与 pandas.DataFrame.resample我可以对 DataFrame 进行下采样: df.resample("3s", how="mean") 这会使用类似日期时间的索引重新采样数据框,
当使用平均聚合(每天到每月)重新采样系列时 -> 缺少的日期时间用 NaN 填充,这是可以的,因为我们可以简单地使用 .dropna() 删除它们功能, 然而,总和/总聚合 -> 缺少的日期时间用 0
我从时间戳为月底的每月系列开始。我想通过填充远期值将它们升级为业务(周一至周五)每日频率。我希望满足两个条件: 如果原始版本是周末,则在重新采样时永远不会丢失值时间序列 始终向前填写:如果原始系列中的
我的 2017 年 1 月数据集结构如下例所示。 Date ProductID ProductType Qty 1.1.2017 1000 101 7 1.1.2017 1
我是 Python 新手。如何根据日期对数据求和并绘制结果? 我有一个 Series 对象,其数据如下: 2017-11-03 07:30:00 NaN 2017-11-03 09:18:0
目前,当我使用 pandas 重新采样功能数天到数周时,它使用星期日到星期六的周,但我希望它使用星期一到星期日的周。这可能吗?我尝试使用文档中的 loffset ,但它根本不会更改数据。 pivot_
根据scipy.signal.resample的文档,速度应该根据输入的长度而变化: As noted, resample uses FFT transformations, which can be
我是一名优秀的程序员,十分优秀!