【问题标题】:Creating a pandas time series datetime with sub-milisecond datetime and downsampling it使用亚毫秒日期时间创建熊猫时间序列日期时间并对其进行下采样
【发布时间】:2022-09-29 10:23:28
【问题描述】:

所以我是熊猫时间序列的新手,但我认为我需要它用于某些应用程序。

我有一个电压记录数据集,它以 2500Hz 的速率采样一小时 它需要下采样到 1500hz。

我如何 A) 为该数据创建一个日期时间索引/对象,然后 B) 将其下采样到 1500Hz?

编辑(这里是一个例子):

original_hz = 1/2500 # 2500 hz
downsample_to_hz = 1/1500 # 1500 hz

# 1 second time index at the two sampling frequencies
time_2500hz = np.arange(0, 1, original_hz) 
time_1500hz = np.arange(0, 1, downsample_to_hz)

# example sine wave of recording at 2500hz
amplitude   = np.sin(time)

我如何对幅度进行下采样和插值,使其与 以 1500hz 采样的时间指数?

我想为此使用 pandas timeseries (https://pandas.pydata.org/docs/user_guide/timeseries.html),但 numpy 中的示例也很有用。

  • 你试过resample吗?请努力提供可重现的示例(理想情况下为 DataFrame 构造函数)。这可能会作为重复关闭。
  • 我对整个语法有点困惑,我可以做一个简单的 100 个随机值的 numpy arange 语句,但不确定这会有什么帮助。
  • 只要您提供代码来重现忠实的示例,以及匹配的预期输出,这就会带来清晰。您还需要定义如何你想重新采样(哪个聚合)
  • 好的,我会尽快做点什么

标签: pandas datetime time-series


【解决方案1】:

这是使用resampleresample.interpolate 的一种方法:

amplitude   = np.sin(time_2500hz)

# set up DataFrame 
df = pd.DataFrame({'signal': amplitude})
# Timedelta index at 2500Hz
df.index = pd.to_timedelta(df.index/2500, unit='s')

# calculate resampling factor
# must be an integer so use microseconds
rate_microsec = 1_000_000//1500

# resample with interpolation
df2 = df.resample(f'{rate_microsec}U').interpolate()

插值输出:

                          signal
0 days 00:00:00         0.000000
0 days 00:00:00.000666  0.000664
0 days 00:00:00.001332  0.001328
0 days 00:00:00.001998  0.001992
0 days 00:00:00.002664  0.002656
...                          ...
0 days 00:00:00.996336  0.803052
0 days 00:00:00.997002  0.803052
0 days 00:00:00.997668  0.803052
0 days 00:00:00.998334  0.803052
0 days 00:00:00.999000  0.803052

[1501 rows x 1 columns]

resampling之前的2500Hz数据:

                          signal
0 days 00:00:00         0.000000
0 days 00:00:00.000400  0.000400
0 days 00:00:00.000800  0.000800
0 days 00:00:00.001200  0.001200
0 days 00:00:00.001600  0.001600
...                          ...
0 days 00:00:00.998000  0.840389
0 days 00:00:00.998400  0.840605
0 days 00:00:00.998800  0.840822
0 days 00:00:00.999200  0.841038
0 days 00:00:00.999600  0.841255

[2500 rows x 1 columns]

附录

我的方法在您的其他问题示例中的输出(8643 行输入)

                            time  channel1  channel2  channel3
0 days 00:00:00            0.000  0.000000  0.000000  0.000000
0 days 00:00:00.000666     1.665 -0.000011 -0.000044 -0.000022
0 days 00:00:00.001332     3.330 -0.000022 -0.000088 -0.000044
0 days 00:00:00.001998     4.995 -0.000033 -0.000132 -0.000066
0 days 00:00:00.002664     6.660 -0.000044 -0.000176 -0.000088
...                          ...       ...       ...       ...
0 days 00:00:03.453876  8325.000 -0.054687 -0.218749 -0.109374
0 days 00:00:03.454542  8325.000 -0.054687 -0.218749 -0.109374
0 days 00:00:03.455208  8325.000 -0.054687 -0.218749 -0.109374
0 days 00:00:03.455874  8325.000 -0.054687 -0.218749 -0.109374
0 days 00:00:03.456540  8325.000 -0.054687 -0.218749 -0.109374

[5191 rows x 4 columns]

【讨论】:

  • 所以我试图为这个问题创建一个最小的例子,但这没有用。我的真实数据帧以 2500 Hz 的速率有 7466712 个样本,我需要对信号进行下采样并将信号插值到 1500 Hz 的速率。当我应用您的解决方案时,它会将我的数据帧索引减少到 1500 行。这不是我想要做的。
  • 能分享一下真实的数据集吗?
  • figshare.com/articles/dataset/… 你想要 Tatum_2017-12-09_K1_g0_t0.imec.lf.bin。
  • 在 python 中打开它的代码是: with open(r'../LFP/Tatum_2017-12-09_lfp/Tatum_2017-12-09_K1_g0_t0.imec.lf.bin', 'rb') as fid: probe_K0_2500hz = np.fromfile (fid, np.int16).reshape((-1, 385))
  • 老实说,我什至不确定我是否需要 pandas 日期时间,但我需要将其插入到以 1500 赫兹采样的情况下,我不知道该怎么做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
相关资源
最近更新 更多