【发布时间】:2019-12-19 00:20:50
【问题描述】:
我正在研究一个由时间戳索引的时间序列,精度为 ns,但实际上它应该是每秒一个。我需要在几秒钟内转换这个时间戳,因为我想提取一些周期性模式,有时我会丢失数据点,我会在每秒对转换后的数据时间重新采样后进行插值。
data = np.array([["2019-07-12 10:39:17.817000+00:00", 45],["2019-07-12 10:39:19.007000+00:00", 45],["2019-07-12 10:39:19.996000+00:00", 40],["2019-07-12 10:39:20.497000+00:00", 1],["2019-07-12 10:39:21.489000+00:00", 10],["2019-07-12 10:39:22.498000+00:00", 3],["2019-07-12 10:39:23.491000+00:00", 5],["2019-07-12 10:39:24.501000+00:00", 15],["2019-07-12 10:39:25.495000+00:00", 8],["2019-07-12 10:39:26.489000+00:00", 3],["2019-07-12 10:39:27.497000+00:00", 90],["2019-07-12 10:39:28.490000+00:00", 4],["2019-07-12 10:39:29.498000+00:00", 37],["2019-07-12 10:39:30.490000+00:00", 55]])
df = pd.DataFrame(data[:, 1], index=data[:, 0], columns=["value"])
df.index=pd.to_datetime(df.index)
print(df.to_string())
value
2019-07-12 10:39:17.817000+00:00 45
2019-07-12 10:39:19.007000+00:00 45
2019-07-12 10:39:19.996000+00:00 40
2019-07-12 10:39:20.497000+00:00 1
2019-07-12 10:39:21.489000+00:00 10
2019-07-12 10:39:22.498000+00:00 3
2019-07-12 10:39:23.491000+00:00 5
2019-07-12 10:39:24.501000+00:00 15
2019-07-12 10:39:25.495000+00:00 8
2019-07-12 10:39:26.489000+00:00 3
2019-07-12 10:39:27.497000+00:00 90
2019-07-12 10:39:28.490000+00:00 4
2019-07-12 10:39:29.498000+00:00 37
2019-07-12 10:39:30.490000+00:00 55
我想要以秒为单位转换日期时间,但这样做我有重复的值:
df.index = df.index.round(freq="S")
print(df.to_string())
value
2019-07-12 10:39:18+00:00 45
2019-07-12 10:39:19+00:00 45
2019-07-12 10:39:20+00:00 40
2019-07-12 10:39:20+00:00 1
2019-07-12 10:39:21+00:00 10
2019-07-12 10:39:22+00:00 3
2019-07-12 10:39:23+00:00 5
2019-07-12 10:39:25+00:00 15
2019-07-12 10:39:25+00:00 8
2019-07-12 10:39:26+00:00 3
2019-07-12 10:39:27+00:00 90
2019-07-12 10:39:28+00:00 4
2019-07-12 10:39:29+00:00 37
2019-07-12 10:39:30+00:00 55
即使我选择 floor 而不是 round 它也不会工作,因为这些值:
2019-07-12 10:39:19.007000+00:00
2019-07-12 10:39:19.996000+00:00
有没有办法以秒为单位转换日期时间,以免产生重复值?
预期输出:
value
2019-07-12 10:39:17+00:00 45
2019-07-12 10:39:18+00:00 45
2019-07-12 10:39:19+00:00 40
2019-07-12 10:39:20+00:00 1
2019-07-12 10:39:21+00:00 10
2019-07-12 10:39:22+00:00 3
2019-07-12 10:39:23+00:00 5
2019-07-12 10:39:24+00:00 15
2019-07-12 10:39:25+00:00 8
2019-07-12 10:39:26+00:00 3
2019-07-12 10:39:27+00:00 90
2019-07-12 10:39:28+00:00 4
2019-07-12 10:39:29+00:00 37
2019-07-12 10:39:30+00:00 55
【问题讨论】:
-
我想比舍入更好的方法是通过插值将数据上采样到固定频率,然后对其进行下采样(如果上采样频率不是最终频率的倍数,则再次通过插值)。但是,没有办法在不丢失信息的情况下进行下采样(除非您的信号首先被过采样)。
-
是的,我知道我问了很多,说我不想丢失信息 :),遗憾的是它不是一个过采样的信号,并且像所有真实数据一样,它没有被很好地收集。谢谢,我会尝试你解释的,我对使用时间序列有点新,所以我可能需要一段时间,但如果它更好,我会告诉你。
-
为什么第二个 18 得到一个值,尽管它在第一个数据帧中没有?因为我认为你只是想要:
df.resample('S').sum() -
你考虑过标准化时间序列吗?
-
@Erfan 因为机器错误地发送数据太晚了,但理论上我应该每秒进行一次测量,有时看起来我一秒钟有两次,但这是因为它的本意之前/之后一秒钟。
标签: python pandas dataframe datetime time-series