如何将 DataFrame 移动到最接近指定时间索引的时间索引?
How can a DataFrame be shifted to the nearest time index to the one specified?
我有一个记录值的 DataFrame,索引设置为 DatetimeIndex。大约每 15 分钟记录一个值。
我想添加一个新列,它是当前值与 24 小时前值的小数差。由于这些值每十五分钟 大约 记录一次,因此我想切换到最接近 24 小时之前的时间索引。如果我尝试完全这样做,我最终会得到很多 NaN
s:
df["value"] / df["value"].shift(freq = datetime.timedelta(days = -1))
应该如何进行这种转换,以便转换到最接近指定时间索引的时间索引?有没有更简单的替代方法来考虑这个问题?
这是一个说明问题的例子:
df = pd.DataFrame(
[
[pd.Timestamp("2015-07-18 13:53:33.280"), 10],
[pd.Timestamp("2015-07-19 13:54:03.330"), 20],
[pd.Timestamp("2015-07-20 13:52:13.350"), 30],
[pd.Timestamp("2015-07-21 13:56:03.126"), 40],
[pd.Timestamp("2015-07-22 13:53:51.747"), 50],
[pd.Timestamp("2015-07-23 13:53:29.346"), 60]
],
columns = [
"datetime",
"value"
]
)
df.index = df["datetime"]
del df["datetime"]
df.index = pd.to_datetime(df.index.values)
df["change"] = df["value"] / df["value"].shift(freq = datetime.timedelta(days = -1))
我会在索引中添加一天,然后使用 pd.DataFrame.reindex
和 method='nearest'
df / df.set_index(df.index + pd.offsets.Day()).reindex(df.index, method='nearest')
value
2015-07-18 13:53:33.280 1.000000
2015-07-19 13:54:03.330 2.000000
2015-07-20 13:52:13.350 1.500000
2015-07-21 13:56:03.126 1.333333
2015-07-22 13:53:51.747 1.250000
2015-07-23 13:53:29.346 1.200000
您可以在 method='nearest'
上提供另一个偏移量作为公差
df / df.set_index(df.index + pd.offsets.Day()).reindex(
df.index, method='nearest', tolerance=pd.offsets.Hour(12))
value
2015-07-18 13:53:33.280 NaN
2015-07-19 13:54:03.330 2.000000
2015-07-20 13:52:13.350 1.500000
2015-07-21 13:56:03.126 1.333333
2015-07-22 13:53:51.747 1.250000
2015-07-23 13:53:29.346 1.200000
按照您的代码:
df/df.shift(1)
value
2015-07-18 13:53:33.280 NaN
2015-07-19 13:54:03.330 2.000000
2015-07-20 13:52:13.350 1.500000
2015-07-21 13:56:03.126 1.333333
2015-07-22 13:53:51.747 1.250000
2015-07-23 13:53:29.346 1.200000
我不确定是否可以,但似乎得到了相同的答案。
我有一个记录值的 DataFrame,索引设置为 DatetimeIndex。大约每 15 分钟记录一个值。
我想添加一个新列,它是当前值与 24 小时前值的小数差。由于这些值每十五分钟 大约 记录一次,因此我想切换到最接近 24 小时之前的时间索引。如果我尝试完全这样做,我最终会得到很多 NaN
s:
df["value"] / df["value"].shift(freq = datetime.timedelta(days = -1))
应该如何进行这种转换,以便转换到最接近指定时间索引的时间索引?有没有更简单的替代方法来考虑这个问题?
这是一个说明问题的例子:
df = pd.DataFrame(
[
[pd.Timestamp("2015-07-18 13:53:33.280"), 10],
[pd.Timestamp("2015-07-19 13:54:03.330"), 20],
[pd.Timestamp("2015-07-20 13:52:13.350"), 30],
[pd.Timestamp("2015-07-21 13:56:03.126"), 40],
[pd.Timestamp("2015-07-22 13:53:51.747"), 50],
[pd.Timestamp("2015-07-23 13:53:29.346"), 60]
],
columns = [
"datetime",
"value"
]
)
df.index = df["datetime"]
del df["datetime"]
df.index = pd.to_datetime(df.index.values)
df["change"] = df["value"] / df["value"].shift(freq = datetime.timedelta(days = -1))
我会在索引中添加一天,然后使用 pd.DataFrame.reindex
和 method='nearest'
df / df.set_index(df.index + pd.offsets.Day()).reindex(df.index, method='nearest')
value
2015-07-18 13:53:33.280 1.000000
2015-07-19 13:54:03.330 2.000000
2015-07-20 13:52:13.350 1.500000
2015-07-21 13:56:03.126 1.333333
2015-07-22 13:53:51.747 1.250000
2015-07-23 13:53:29.346 1.200000
您可以在 method='nearest'
df / df.set_index(df.index + pd.offsets.Day()).reindex(
df.index, method='nearest', tolerance=pd.offsets.Hour(12))
value
2015-07-18 13:53:33.280 NaN
2015-07-19 13:54:03.330 2.000000
2015-07-20 13:52:13.350 1.500000
2015-07-21 13:56:03.126 1.333333
2015-07-22 13:53:51.747 1.250000
2015-07-23 13:53:29.346 1.200000
按照您的代码:
df/df.shift(1)
value
2015-07-18 13:53:33.280 NaN
2015-07-19 13:54:03.330 2.000000
2015-07-20 13:52:13.350 1.500000
2015-07-21 13:56:03.126 1.333333
2015-07-22 13:53:51.747 1.250000
2015-07-23 13:53:29.346 1.200000
我不确定是否可以,但似乎得到了相同的答案。