У меня есть pandas df, у которого есть 2 столбца, такие как Date, First_Date (constant).

Я пытаюсь добавить новый столбец, в котором будет значение 0, где First_Date = Date. Затем все строки ниже этого экземпляра должны увеличиваться в отрицательном направлении, например -1, -2, -3 и т. Д., И то же самое должно быть верно для строк выше, должны увеличиваться в положительном направлении, например 1,2,3,4 и т. Д. См. Приложение для визуализации концепции.

Я не уверен, есть ли для этого функция pandas или в этом случае функция лучше. Любое руководство было бы отличным.

enter image description here

0
titu84hh 10 Окт 2021 в 02:05

2 ответа

Лучший ответ
>>> df = pd.DataFrame({'Date':pd.date_range('2020-01-01', '2020-01-18')})
>>> df
         Date
0  2020-01-01
1  2020-01-02
2  2020-01-03
3  2020-01-04
4  2020-01-05
5  2020-01-06
6  2020-01-07
7  2020-01-08
8  2020-01-09
9  2020-01-10
10 2020-01-11
11 2020-01-12
12 2020-01-13
13 2020-01-14
14 2020-01-15
15 2020-01-16
16 2020-01-17
17 2020-01-18

Оформить заказ pandas отметки времени строками для DateTime и т. Д. Нет причин работать со строками и вставками.

>>> df['index'] = df - pd.Timestamp('2020-01-11')
>>> df
         Date    index
0  2020-01-01 -10 days
1  2020-01-02  -9 days
2  2020-01-03  -8 days
3  2020-01-04  -7 days
4  2020-01-05  -6 days
5  2020-01-06  -5 days
6  2020-01-07  -4 days
7  2020-01-08  -3 days
8  2020-01-09  -2 days
9  2020-01-10  -1 days
10 2020-01-11   0 days
11 2020-01-12   1 days
12 2020-01-13   2 days
13 2020-01-14   3 days
14 2020-01-15   4 days
15 2020-01-16   5 days
16 2020-01-17   6 days
17 2020-01-18   7 days

Впоследствии вы можете получить желаемое с помощью:

>>> df['index'].transform(lambda x: x.days)
0    -10
1     -9
2     -8
3     -7
4     -6
5     -5
6     -4
7     -3
8     -2
9     -1
10     0
11     1
12     2
13     3
14     4
15     5
16     6
17     7

РЕДАКТИРОВАТЬ

Чтобы ответить более конкретно, поскольку у вас есть строковые даты, вы должны сначала сделать следующее

df[['Date', 'First_Date']] = df[['Date', 'First_Date']].astype('datetime64[ns]')

Затем вы можете вычесть столбцы и получить результат:

df['index'] = df['Date'] - df['First_Date']
0
Joseph Doun 9 Окт 2021 в 23:42
import datetime

dates=['2020-01-01','2020-01-02',...] #list of strings
constant='2020-01-11'
const=datetime.datetime.strptime(constant,'%Y-%m-%d')
lista=[(x,constant,(datetime.datetime.strptime(x,'%Y-%m-%d')-const).days) 
for x in dates] #lista is a list of tuples [(date,constant,days)..]

Надеюсь, что это работает!

0
ilshatt 10 Окт 2021 в 00:20