在熊猫数据框中重新采样 Hz

Posted

技术标签:

【中文标题】在熊猫数据框中重新采样 Hz【英文标题】:Resampling Hz in a pandas dataframe 【发布时间】:2020-01-10 15:52:42 【问题描述】:

我正在处理 python 上的 pandas 项目。我收到这样的 .csv 文件作为输入:

Name   Timestamp       Data
A1       259           [1.1,1.0,0.1]
A1       260           [-0.1,1.2,0.3]
A1       261           [0.1,0.2,-0.3]
...
A1       14895         [1.4,0.3,1.8]
...      
A2       278           [-1.1,1.2,0.4]
A2       353           [-0.1,1.2,0.3]
A2       409           [-0.1,1.2,0.3]
...
A2       14900         [-0.1,1.2,0.3]
...
A1140    107           [-0.5,-1.0,-1.0]
A1140    107           [0.6,0.1,0.3]
A1140    114           [-1.1,-1.2,0.3] 
... 
A1140    14995         [-1,1.2,0.4]

我有 1140 多个名字,每个名字都有成百上千的数据。 数据以 200 赫兹的频率记录,我认为时间戳数字表示毫秒,虽然我不确定,但我无权访问此信息。 我必须重新采样到 50 Hz 频率。

我该怎么做?我是否需要将时间戳转换为实际秒数,然后使用 0.25 秒的.resample() 函数?我应该使用.groupby["Name"] 函数吗? 提前谢谢!

【问题讨论】:

200 Hz 表示每 5 毫秒一个样本。您的数据没有反映出来,有不同时间戳的样本相差不等于 5 毫秒。 我不确定是毫秒,我编辑了,谢谢。 您是如何获得 200 Hz 信息的?采样似乎非常不一致,因此说采样以一定的频率发生至少会让人感到困惑。 例如,在 A1140 中,您有两个具有相同时间戳的测量值。 另外,你的目标是什么?您想要一个格式相同但频率不同的文件,还是(例如)每个名称的不同文件? 【参考方案1】:

我无法准确完整地回答这个问题,因为即使您也不确定时间戳,但我会尽力为您提供一些一般性指导。 您在这里拥有的称为面板数据,每个“名称”都有许多不同的时间序列。groupby(['Name']).apply(<func>) 确实是一种有用的方法,因为它允许操作每个不同的名称分开处理,让您可以使用时间序列这种更简单的数据类型。 时间序列是以下类型的数据:

Date                  Value
2000-01-01 00:00:00   3
2000-01-01 00:03:00   12
2000-01-01 00:06:00   21

如您所见,采集每个样本的时间段为 3 分钟。我们可以调用 resample() 并将其转换为 10 分钟,如下所示:

series.resample('10T').mean()

请注意,您可以使用.apply(<func>) 代替mean 来选择下采样方法。有关频率的更多信息,请考虑this 问题。


总而言之,您最好的选择是尝试找出确切的时间戳,将其转换为 DateTime 然后使用
df.groupby(['Name']).resample('20L').mean()

或使用 for 循环遍历每个名​​称并单独对每个系列使用重新采样。

【讨论】:

非常感谢!在我的情况下,“时间戳”对应于从记录活动开始的秒数(或毫/纳/微秒)。所以假设如果我的时间戳中的数字以 200hz 的毫秒数表示,我首先要: df ['Timestamp'] = pd.to_datetime(df['Timestamp'], unit='ms') (我希望它是正确的)然后 df.groupby(['Name']).resample('20L').mean() 对吗? (20L 是从 200 到 50hz 的毫秒数,对吧?) 是的,这似乎是正确的,但是只有您可以访问数据才能测试代码,因此可能会出现意外问题。 是的,我认为数据有点错误,我会问。最后一个问题,对于以纳秒为单位的数据,50hz 的转换会是 .resample('20000000N') 对吧? 你不需要指定这个。 .resample('20000000N') 应该与 .resample('20L') 完全相同,剩下的工作由 pandas 完成。 这取决于您的输出(即使不是不可能预测,也很难预测)。从时间戳转换为数字(毫秒或纳秒或其他)应该不难,如果您搜索,您将很容易找到答案。

以上是关于在熊猫数据框中重新采样 Hz的主要内容,如果未能解决你的问题,请参考以下文章

如何重新采样(下采样)时间序列大数据,从 10 Hz(毫秒)想要使用 pyspark 转换为 1 Hz(秒)

如何将 pandas Dataframe 时间序列数据从 8hz 重新采样到 16hz?

重新采样熊猫数据框并用零填充新行

熊猫数据框每天重新采样,没有日期时间索引

熊猫数据框每天重新采样,没有日期时间索引

如何计算熊猫中重新采样的多索引数据帧