【问题标题】:Downsampling a CSV by a factor of 10 and saving it into another file [closed]将 CSV 下采样 10 倍并将其保存到另一个文件中 [关闭]
【发布时间】:2020-04-10 03:12:42
【问题描述】:

我有一个包含许多行(即 3000 到 4000)的 .csv 文件,其中每一行代表一个采样率为 1Hz 的事件。我想创建另一个 .csv,其中每一行代表一个采样率为 0.1Hz 的事件。

换句话说,我想从分辨率为每秒 1 个事件的 .csv 转换为分辨率为每 10 秒 1 个事件的 .csv。

我需要一个与语言无关的算法的伪代码,还需要一个实现(最好用 C 语言)。

【问题讨论】:

  • 你打算用你标记的所有语言实现这个?
  • 你的意思是awk '(NR-1) % 10 == 0' foo.csv
  • 在命令行中?是 awk 名称文件还是命令?
  • @DannyLeePiloote 把它黑进你的 shell
  • 请参阅stackoverflow.com/questions/32349263/… 了解基本的 CSV 解析器。根据需要进行调整。

标签: python c pandas csv awk


【解决方案1】:

不太清楚你想用哪种语言实现它。这是一个与语言无关的计划:

  • 请求用户加载文件
  • 以读取方式打开文件
  • 以写入模式打开另一个文件
  • 逐行遍历读取文件。
  • 保留一个计数器,并在每次读取循环中的一行时递增它。
  • if counter mod 10 == 0 然后将该行附加到写入文件中。
  • 完成后关闭这两个文件。

这是一个更高级别的 python 实现,它使用 pandas 为我们进行低级操作。

import pandas as pd

# Boilerplate to simulate the author initial condition
# Creating a sample CSV file with a 1Hz resolution
df = pd.DataFrame()
df['time'] = pd.date_range(start='2020-01-08', periods=3000, freq='s')
df.to_csv(path_or_buf="input.csv",index=False)

# Read the file
df = pd.read_csv('input.csv')
# Convert to datetime
df['time'] = pd.to_datetime(df['time'])
# Resampling down to 0.1Hz
df = df.resample('10s', on='time').first()
df.to_csv(path_or_buf="output.csv",index=False)

这个产量:

2020-01-08 00:00:00
2020-01-08 00:00:10
2020-01-08 00:00:20
2020-01-08 00:00:30
2020-01-08 00:00:40

【讨论】:

  • 如果它可以在 C 中,会更好,因为我在 C 方面的经验更好,但正在查看哪种语言导致最短的程序!
  • 在 Python 中这是一个 5-6 班轮
  • awk 它是一个 1-liner... 我想知道,为什么 OP 对此不满意,太容易了? ;)
  • Perl 也可以在一行中完成;不过,它会比 Awk 版本更难以理解。
  • 那我得学那个 awk
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2021-02-11
相关资源
最近更新 更多