在熊猫数据框中重新采样 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(秒)