我有一个如下所示的时间序列:
value date
63.85 2017-01-15
63.95 2017-01-22
63.88 2017-01-29
64.02 2017-02-05
63.84 2017-02-12
62.13 2017-03-05
65.36 2017-03-25
66.45 2017-04-25
我想颠倒行的顺序,使它们看起来像这样:
value date
66.45 2000-01-01
65.36 2000-02-01
62.13 2000-02-20
63.84 2000-03-12
64.02 2000-03-19
63.88 2000-03-26
63.95 2000-04-02
63.85 2000-04-09
如您所见,“值”列需要简单地翻转行值,但对于日期列,我想要做的是在日期之间保持相同的“天数差异”。只要天数差异也正确翻转,开始日期值是多少并不重要。在示例的第二个数据帧中,开始日期值为 2000-01-01,第二个值为 2020-02-01,比第一个日期晚 31 天。这个 31 天的“日差”与第一个数据帧的最后一个日期 (2017-04-25) 和倒数第二个日期 (2017-03-25) 相同。并且,第二个数据帧的第二个值 (2000-02-01) 和第三个值 (2000-02-20) 也是如此:“天数差异”是 20 天,倒数第二个日期 (2017- 03-25)和第一个数据帧的倒数第二个日期(2017-03-05)。等等。
我相信执行此操作所需的步骤需要首先计算此“日差”,但我想知道如何有效地做到这一点。谢谢:)
最佳答案
NumPy 通过其 datetime
和 timedelta
数据类型对此提供支持。
首先,按如下所示反转时间序列中的两列:
import pandas as pd
import numpy as np
df2 = df
df2 = df2.iloc[::-1]
df2
其中 df
是原始时间序列数据,df2
(如下所示)是反转时间序列。
value date
7 66.45 2017-04-25
6 65.36 2017-03-25
5 62.13 2017-03-05
4 63.84 2017-02-12
3 64.02 2017-02-05
2 63.88 2017-01-29
1 63.95 2017-01-22
0 63.85 2017-01-15
接下来找到日差并将其存储为 timedelta
对象:
dates_np = np.array(df2.date).astype(np.datetime64) # Convert dates to np.datetime64 ojects
timeDeltas = np.insert(abs(np.diff(dates_np)), 0, 0) # np.insert is to account for -1 length during np.diff call
d2 = {'value': df_reversed.value, 'day_diff': timeDeltas} # Create new dataframe (df3)
df3 = pd.DataFrame(data=d2)
df3
其中df3
(日差表)如下所示:
value day_diff
7 66.45 0 days
6 65.36 31 days
5 62.13 20 days
4 63.84 21 days
3 64.02 7 days
2 63.88 7 days
1 63.95 7 days
0 63.85 7 days
最后,要返回从开始数据开始累积的日期,请执行以下操作:
startDate = np.datetime64('2000-01-01') # You can change this if you like
df4 = df2 # Copy coumn data from df2
df4.date = np.array(np.cumsum(df3.day_diff) + startDate # np.cumsum accumulates the day_diff sum
df4
其中df4
(开始日期累积)如下所示:
value date
7 66.45 2000-01-01
6 65.36 2000-02-01
5 62.13 2000-02-21
4 63.84 2000-03-13
3 64.02 2000-03-20
2 63.88 2000-03-27
1 63.95 2000-04-03
0 63.85 2000-04-10
我注意到我的决赛 table 存在 1 天的差异,但这很可能是由于实现了 timedelta 包容性/排他性。
关于python - 反转时间序列数据框中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64745344/