#python #date
#python #Дата
Вопрос:
У меня есть набор данных, который выглядит следующим образом:
ID Date
1 3 2016-04-01
2 3 2016-04-02
3 3 2016-04-03
4 3 2016-04-04
5 3 2016-04-05
6 3 2017-04-01
7 3 2017-04-02
8 3 2017-04-03
9 3 2017-04-04
10 3 2017-04-05
11 7 2016-04-01
12 7 2016-04-02
13 7 2016-04-03
14 7 2016-04-04
15 7 2016-04-05
16 7 2017-04-01
17 7 2017-04-02
18 7 2017-04-03
19 7 2017-04-04
20 7 2017-04-05
Я хочу изменить год дат с учетом двух условий. Условиями являются значение идентификатора и год даты. Например, если ID = 3 и год 2016, я хочу изменить его на 2014
Ответ №1:
Вы можете использовать что-то вроде этого:
def f(x):
if x['ID'] == 3 and '2016' in x['Date']:
return x['Date'].replace('2014','2016')
else:
return x['Date']
df['new_column'] = df.apply(f, axis=1)
В зависимости от того, как хранится дата, вы должны изменить. Этот пример предназначен для простой строки, но должен быть адаптирован к другим типам.
Если вы хотите использовать лямбда-функцию:
df['new_column'] = df.apply(lambda x: x['Date'].replace('2014', '2016') if x['ID'] == 3 and '2016' in x['Date'] else x['Date'], axis=1)
Ответ №2:
Аналогично, если ваши данные хранятся как datetime
объект, ваша соответствующая функция является x['date'] = x['date'].replace(2016)
, а ваше условие является x['date'].year == 2014
Следуя предыдущему ответу, однострочный вариант будет выглядеть следующим образом:
df['date'] = df.apply(lambda x: x['Date'].replace(2014) if x['ID'] == 3 and x['date'].year == 2016 else x['date'], axis=1)`
Вообще говоря, я бы рекомендовал работать с datetime
для дат и времени.
Ответ №3:
data['Date'] = data.apply(lambda x: x['Date'].replace('2016','2014') if (x['ID'] == 3 and "2016" in x['Date']) else x['Date'], axis=1)
Вывод:
ID Date
0 3 2014-04-01
1 3 2014-04-02
2 3 2014-04-03
3 3 2014-04-04
4 3 2014-04-05
5 3 2017-04-01
6 3 2017-04-02
7 3 2017-04-03
8 3 2017-04-04
9 3 2017-04-05
10 7 2016-04-01
11 7 2016-04-02
12 7 2016-04-03
13 7 2016-04-04
14 7 2016-04-05
15 7 2017-04-01
16 7 2017-04-02
17 7 2017-04-03
18 7 2017-04-04
19 7 2017-04-05