python - 添加特定日期之前的天数作为列

标签 python pandas time-series

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

这是一个最小的示例,其中添加了感兴趣的列(“y”)以便更好地理解。该示例还说明了这样一个事实:尽管数据集结束,但人们必须考虑相应数据帧中考虑的时间之外的下一个事件。在此示例中,距下一次事件(时间为 2019-01-08)还有 4 天。

import pandas as pd
import numpy as np
date_range = pd.date_range('01/01/2019 00:00:00','01/04/2019 23:00:00',freq='H')
x = np.zeros(len(date_range))
df = pd.DataFrame(data=x,columns=['x'])
df.set_index(date_range,inplace=True)
df.iloc[48:72] = 1
df['y'] = np.repeat([-2,-1,0,-4],24)

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

最佳答案

使用Timedelta

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 19:00:00  0.0               NaT
2019-01-04 20:00:00  0.0               NaT
2019-01-04 21:00:00  0.0               NaT
2019-01-04 22:00:00  0.0               NaT
2019-01-04 23:00:00  0.0               NaT

[96 rows x 2 columns]

如果您想在最后举办一个事件...只需将其先放在那里即可

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]

关于python - 添加特定日期之前的天数作为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57598474/

相关文章:

jQuery parseJSON 对象问题/问题

python - 判断一个值是否在倍数范围内的算法

r - 'statsmodels' 或其他 Python 包是否提供等效于 R 的 'step' 函数?

time-series - 结转每个案例的数据

r - R 中的 MCMC 变点模型

python - pandas 自定义工作日偏移量的性能

Python subprocess.check_output 转换为 windows

python - 使用 if 语句增加理解变量?

python - 更改数据框中一组条目的数据类型

python - 从查询集中获取所有多对多对象的有效方法