python - 反转时间序列数据框中的行

标签 python pandas date time-series

我有一个如下所示的时间序列:

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 通过其 datetimetimedelta 数据类型对此提供支持。

首先,按如下所示反转时间序列中的两列:

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/

相关文章:

python - Python 中用于 Perl 的 Linux 命令

python - 是否有与平台无关的 time.gmtime 实现?

python - 如何处理和提取图像中的文本

javascript - JQuery Daterangepicker onchange 事件

python - S3 响应错误 : 403 Forbidden using Boto

python - Matplotlib:绘制数据然后进行时间序列预测

python - 为什么 pandas apply lambda 比这里的循环慢?

python - 对 Pandas 数据帧的所有元素应用 if/then 条件

java - 在 jTable 中动态解析日期

javascript - 通过循环将日期添加到数组