Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将某些日期之前的天数添加为列_Python_Pandas_Time Series - Fatal编程技术网

Python 将某些日期之前的天数添加为列

Python 将某些日期之前的天数添加为列,python,pandas,time-series,Python,Pandas,Time Series,我有一个以小时日期为索引的时间序列数据集。有一列指示特定日期是否为事件(1)(0)。我想添加一个列,将事件开始前的天数倒计时。每当发生事件时,此列的值应为0。事件发生后,它应该再次倒计时。当然,假设所有事件日期都是已知的 下面是一个简单的示例,其中添加了感兴趣的列(“y”),以便更好地理解。该示例还说明了这样一个事实,即尽管数据集结束了,但必须考虑超出相应数据帧中考虑的时间的下一个事件。在本例中,距离下一个事件(2019-01-08)还有4天 我想找到一种生成列“y”的方法 使用Timedelt

我有一个以小时日期为索引的时间序列数据集。有一列指示特定日期是否为事件(1)(0)。我想添加一个列,将事件开始前的天数倒计时。每当发生事件时,此列的值应为0。事件发生后,它应该再次倒计时。当然,假设所有事件日期都是已知的

下面是一个简单的示例,其中添加了感兴趣的列(“y”),以便更好地理解。该示例还说明了这样一个事实,即尽管数据集结束了,但必须考虑超出相应数据帧中考虑的时间的下一个事件。在本例中,距离下一个事件(2019-01-08)还有4天

我想找到一种生成列“y”的方法

使用
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]