【发布时间】:2020-01-12 07:10:21
【问题描述】:
尝试在 pandas 中重新采样数据框。 我在输入中收到这样的 .csv(数据列中的列表是字符串形式):`
Name,Timestamp,Data
A1,5.26,"[1.0,1.2,1.9]"
A1,5.28,"[1.8,2.1,3.9]"
A1,5.30,"[1.2,1.4,0.9]"
A1,5.32,"[...]"
...
A2,5.26,"[...]"
A2,5.28,"[...]"
A2,5.30,"[...]"
A2,5.32,"[...]"
...
A3,5.26,"[...]"
A3,5.28,"[...]"
A3,5.30,"[...]"
A3,5.32,"[...]"`
数据以 50hz 记录(因此每 20ms)。我想重新采样 25hz(所以每 40ms)。
我使用
将数据列从字符串转换为实际列表df['Data'] = df['Data'].apply(ast.literal_eval)
时间戳记为秒:
df['Timestamp'] = pd.to_datetime(df['Timestamp'], unit='s')
我知道我必须使用.resample() 函数,所以我尝试了
df.groupby('Name').resample("40L", on='Timestamp')
它并没有给我错误,但它似乎根本没有重新采样,事实上我有相同数量的行具有相同的数据,只是时间戳列转换为日期时间(如果我添加一个 @987654326 @ resample 函数结束后,它给了我错误No numeric types to aggregate)。
我希望重新采样后的我的表看起来像:
Name Timestamp Data
A1 5.26 [...]
A1 5.30 [...]
...
A2 5.26 [...]
A2 5.30 [...]
...
A3 5.26 [...]
A3 5.30 [...]
我该怎么办?
【问题讨论】:
-
您想重新采样为
mean还是仅提取5.26, 5.30...的记录?将您的Data转换为不同的列可以让您resample().mean()。 -
Mh.. 你能为我提供两种解决方案吗?这将非常有帮助。虽然我无法提取这些记录,因为我有其他数据帧但频率不同(例如从 80 到 50hz 或从 200 到 50hz),所以我需要一个更通用的解决方案,使用 .resample 或类似的东西(抱歉转发,消息是切,我刚刚注意到)
-
请提供更多数据,例如其他组也是如此。
Data是列文字吗? -
我只有这 3 列。对于每个名称
A1,A2,A3..,时间戳从 5.26 变为 40.00 +(总是几乎正好是 0.2 的频率)。在 .csv 中,Data列是一个字符串(例如,csv 的第一行是A1,5.26,"[1.9549347, -9.73276, -0.36118067060405273]")所以在 python 中,我通过df['Data'] = df['Data'].apply(ast.literal_eval)将其转换为实际数字你需要一些其他信息吗?感谢您的帮助