在pandas中使用时间增量时考虑周末/节假日

huwehgph  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(117)

所以这里有一个问题,我花了一段时间才弄清楚为什么会发生...
我有一个dataframe的值与工作日的日期时间索引。
添加一个新列'ColB',它的值总是与colA相同,除了colA为0。然后我想使用colA的 previous days值。
举例来说:
| 一个|B| B |
| --|--| ------------ |
| 七|七| 7 |
| 三个|三个| 3 |
| 0|三个| 3 |
| 五|五| 5 |
| 0|五| 5 |
注意2019-11-13上的colB如何变成2019-11-12上的colA的值。15日也是:colB从第14位取colA。
我使用了这个列表解析:

df.loc[:,'colB'] = [df.loc[d-pd.Timedelta(1,'d'),'ColA'] if df.loc[d,'ColA']==0 else df.loc[d,'ColA'] for d in df.index]

字符串
我以为它不工作(KeyError:Timestamp('2019 -11-03 00:00:00')),但我发现问题的发生是因为我在星期一有一个零,因此没有d-pd.Timedelta(1,'d')的行,这将是一个星期天。
我想同样的问题也会发生在我假期后的第二天。
为了解决这个问题,当col A为零时,我实际上需要使用colA中的前一个值作为colB,而不是前一个DAYS值,就像我在列表解析中所做的那样。
我通过重新索引解决了这个问题,使用序列号而不是日期,但我认为使用日期更好。
我试过shift:

df.loc[:,'colB'] = [df.loc[d,'ColA'].shift(-1) if df.loc[d,'ColA']==0 else df.loc[d,'ColA'] for d in df.index]


但是得到一个错误:AttributeError: 'numpy.int64' object has no attribute 'shift'
有谁能想到一个简单的方法来做到这一点,而无需重新索引?
谢谢你,谢谢

8gsdolmq

8gsdolmq1#

试试这个:

df.assign(B = df['A'].replace(0))

字符串
输出量:

Day  A  B
0  2019-11-11  7  7
1  2019-11-12  3  3
2  2019-11-13  0  3
3  2019-11-14  5  5
4  2019-11-15  0  5

afdcj2ne

afdcj2ne2#

您可以使用shift()方法将索引移动给定的周期数。shift()向下滑动值(而不是索引),可用于根据前一行的值填充列中缺失的值。
您可以将其与where()函数结合使用,该函数将替换条件为False的值。

df['ColB'] = df['ColA'].where(df['ColA'] != 0, df['ColA'].shift(1))

字符串
这将创建一个新的列'ColB',并在'ColA'不为零时为其赋值'ColA'。如果'ColA'为零,则它取'ColA'前一行的值。
要同时处理第一行,请使用fillna()函数。此函数将NA/NaN值替换为指定值。
在下面的例子中,如果'ColA'的第一行为0,它将被'ColA'的第二个值替换。如果要用其他值替换,可以用所需的值替换下面的df['ColA'][0]

df['ColB'] = df['ColA'].where(df['ColA'] != 0, df['ColA'].shift(1)).fillna(df['ColA'][0])

相关问题