Python 将某些日期之前的天数添加为列
我有一个以小时日期为索引的时间序列数据集。有一列指示特定日期是否为事件(1)(0)。我想添加一个列,将事件开始前的天数倒计时。每当发生事件时,此列的值应为0。事件发生后,它应该再次倒计时。当然,假设所有事件日期都是已知的 下面是一个简单的示例,其中添加了感兴趣的列(“y”),以便更好地理解。该示例还说明了这样一个事实,即尽管数据集结束了,但必须考虑超出相应数据帧中考虑的时间的下一个事件。在本例中,距离下一个事件(2019-01-08)还有4天 我想找到一种生成列“y”的方法 使用Python 将某些日期之前的天数添加为列,python,pandas,time-series,Python,Pandas,Time Series,我有一个以小时日期为索引的时间序列数据集。有一列指示特定日期是否为事件(1)(0)。我想添加一个列,将事件开始前的天数倒计时。每当发生事件时,此列的值应为0。事件发生后,它应该再次倒计时。当然,假设所有事件日期都是已知的 下面是一个简单的示例,其中添加了感兴趣的列(“y”),以便更好地理解。该示例还说明了这样一个事实,即尽管数据集结束了,但必须考虑超出相应数据帧中考虑的时间的下一个事件。在本例中,距离下一个事件(2019-01-08)还有4天 我想找到一种生成列“y”的方法 使用Timedelt
Timedelta
如果你想在最后有个活动。。。先把它放在那里
df.at[pd.Timestamp('2019-01-08'), 'x'] = 1
那么同上
df.assign(
y=df.index - df.index.to_series().mask(df.x != 1).bfill()
)
x y
2019-01-01 00:00:00 0.0 -2 days +00:00:00
2019-01-01 01:00:00 0.0 -2 days +01:00:00
2019-01-01 02:00:00 0.0 -2 days +02:00:00
2019-01-01 03:00:00 0.0 -2 days +03:00:00
2019-01-01 04:00:00 0.0 -2 days +04:00:00
... ... ...
2019-01-04 20:00:00 0.0 -4 days +20:00:00
2019-01-04 21:00:00 0.0 -4 days +21:00:00
2019-01-04 22:00:00 0.0 -4 days +22:00:00
2019-01-04 23:00:00 0.0 -4 days +23:00:00
2019-01-08 00:00:00 1.0 0 days 00:00:00
[97 rows x 2 columns]
如果你把心放在整数上
df.assign(
y=(
df.index -
df.index.to_series().mask(df.x != 1).bfill()
).dt.days
)
x y
2019-01-01 00:00:00 0.0 -2
2019-01-01 01:00:00 0.0 -2
2019-01-01 02:00:00 0.0 -2
2019-01-01 03:00:00 0.0 -2
2019-01-01 04:00:00 0.0 -2
... ... ..
2019-01-04 20:00:00 0.0 -4
2019-01-04 21:00:00 0.0 -4
2019-01-04 22:00:00 0.0 -4
2019-01-04 23:00:00 0.0 -4
2019-01-08 00:00:00 1.0 0
[97 rows x 2 columns]
谢谢这是一个非常酷的解决方案。一个简短的后续问题:出于某种原因,使用
at
添加带有日期的新行不起作用。它说:“无法从复制轴重新编制索引”。我的实际数据集有多个列,索引标题是timestamp,但这是与提供的最小示例相比的唯一区别。如果你看不到数据,可能很难提供帮助,但也许你知道为什么会发生这种情况。再次感谢!
df.assign(
y=df.index - df.index.to_series().mask(df.x != 1).bfill()
)
x y
2019-01-01 00:00:00 0.0 -2 days +00:00:00
2019-01-01 01:00:00 0.0 -2 days +01:00:00
2019-01-01 02:00:00 0.0 -2 days +02:00:00
2019-01-01 03:00:00 0.0 -2 days +03:00:00
2019-01-01 04:00:00 0.0 -2 days +04:00:00
... ... ...
2019-01-04 20:00:00 0.0 -4 days +20:00:00
2019-01-04 21:00:00 0.0 -4 days +21:00:00
2019-01-04 22:00:00 0.0 -4 days +22:00:00
2019-01-04 23:00:00 0.0 -4 days +23:00:00
2019-01-08 00:00:00 1.0 0 days 00:00:00
[97 rows x 2 columns]
df.assign(
y=(
df.index -
df.index.to_series().mask(df.x != 1).bfill()
).dt.days
)
x y
2019-01-01 00:00:00 0.0 -2
2019-01-01 01:00:00 0.0 -2
2019-01-01 02:00:00 0.0 -2
2019-01-01 03:00:00 0.0 -2
2019-01-01 04:00:00 0.0 -2
... ... ..
2019-01-04 20:00:00 0.0 -4
2019-01-04 21:00:00 0.0 -4
2019-01-04 22:00:00 0.0 -4
2019-01-04 23:00:00 0.0 -4
2019-01-08 00:00:00 1.0 0
[97 rows x 2 columns]