Pandas datetime: найти правильный год для первой даты после datetime - PullRequest
0 голосов
/ 25 июня 2018

Я начал с фрейма данных следующим образом:

In [24]: df = pd.DataFrame(
    ...:     {'date1': ['10/02/2012', '10/02/2012', 'NA/NA/2014', 'NA/NA/2014', '01/02/2014'],
    ...:     'date2': ['10-Nov', '19-Oct', '26-Nov', '23-Oct', '14-Oct'],
    ...:     'date3': ['30/06/2011', '30/06/2011', '30/06/2013', '30/06/2013', 'NA']})
    ...:

In [25]: df
Out[25]:
        date1   date2       date3
0  10/02/2012  10-Nov  30/06/2011
1  10/02/2012  19-Oct  30/06/2011
2  NA/NA/2014  26-Nov  30/06/2013
3  NA/NA/2014  23-Oct  30/06/2013
4  01/02/2014  14-Oct  NA

Мне удалось преобразовать даты в объекты datetime.Поэтому у меня есть следующий фрейм данных:

In [26]: df["date1"] = pd.to_datetime(df["date1"], errors="coerce", dayfirst=True, infer_datetime_format=True)
    ...: df["date3"] = pd.to_datetime(df["date3"], errors="coerce", dayfirst=True, infer_datetime_format=True)
    ...: df["date2"] = pd.to_datetime(df["date2"], errors="coerce", dayfirst=True, format="%d-%b")
    ...: df
    ...:
Out[26]:
       date1      date2      date3
0 2012-02-10 1900-11-10 2011-06-30
1 2012-02-10 1900-10-19 2011-06-30
2        NaT 1900-11-26 2013-06-30
3        NaT 1900-10-23 2013-06-30
4 2014-01-02 1900-10-14        NaT

Поскольку date2 не имеет кодировки year, установите все значения year равными 1900.

Однако мне нужен первыйдата в date2, которая была достигнута ПОСЛЕ date3, и связанная с ней дата-время year.

ТАКЖЕ ПРИМЕЧАНИЕ:

Когда date3 равно NaT Мне нужно оглянуться назад от date1, чтобы заполнитьгод date2.Это можно увидеть в df.iloc[4,:]

Поэтому я хочу, чтобы выходной дата-кадр был:

       date1      date2      date3
0 2012-02-10 2011-11-10 2011-06-30
1 2012-02-10 2011-10-19 2011-06-30
2        NaT 2013-11-26 2013-06-30
3        NaT 2013-10-23 2013-06-30
4 2014-01-02 2013-10-14        NaT

Это сложнее, чем просто использование date3.year, потому что иногда date3 задерживается вгод (например, 30/12/2013 -> 2013-12-30) и, таким образом, date2 будет первой датой в следующем году (т.е. 14-Oct -> 1900-10-14 -> 2014-10-14).

Более того, когда это возвращает nan, мне нужно, чтобы дата и время были достаточно устойчивыми, чтобы возвращать NaT.

Поэтому мне нужно найти следующее year ПОСЛЕ date3, которое соответствует day-month в date2,Или, если этого не хватает, мне нужен year ПЕРЕД date1, который соответствует day-month в date2.

1 Ответ

0 голосов
/ 25 июня 2018

Вы можете применить md сравнить с датой2 и датой3

pd.to_datetime(((df.date2.dt.strftime('%m%d')<df.date3.dt.strftime('%m%d')).astype(int)+df.date3.dt.year).astype(str)+'-'+df.date2.dt.strftime('%m-%d'))
Out[62]: 
0   2011-11-10
1   2011-10-19
2   2013-11-26
3   2013-10-23
4   2013-10-14
dtype: datetime64[ns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...