Получить ближайшую будущую дату в фрейме данных pandas от сегодняшней даты - PullRequest
2 голосов
/ 21 мая 2019

У меня есть DataFrame df_holiday, и я хочу выбрать строку, которая состоит из ближайшей ближайшей даты от сегодняшней даты, чтобы извлечь название праздника.

+----------+---------------------+
|   date   |        name         |
+----------+---------------------+
| 01012019 | Neujahr             |
| 06012019 | Heilige Drei Könige |
| 19042019 | Karfreitag          |
| 22042019 | Ostermontag         |
| 01052019 | Tag der Arbeit      |
| 10062019 | Pfingstmontag       |
+----------+---------------------+

Если я сделаю type(df_holiday['date'][0]), он выдаст str

Теперь я хочу преобразовать столбец в формат даты и времени, используя это:

import datetime
df_holiday['date'] = df_holiday['date'].apply(lambda x: datetime.datetime.strptime(x, '%d%m%Y'))

Первый вопросздесь: Док говорит, что он вернет дату и время, но в моем случае я получаю метку времени, почему?

type(df_holiday['date'][0])
pandas._libs.tslibs.timestamps.Timestamp

print(df_holiday['date'][0]
Timestamp('2019-01-01 00:00:00')

Я нашел этот пост от dawg , который предложил следующую процедуру:

min([d for d in df_holiday['date'] if d> datetime.date.today()], key=lambda s: 
          datetime.datetime.strptime(s, "%d%m%Y").date()-datetime.date.today())

Поскольку значения в столбце даты являются временными метками, я получил

TypeError: Невозможно сравнить тип 'Timestamp' с типом 'date'

Iдумаю, что это сработает, если возможно преобразовать столбец даты в правильный формат даты и времени, а не в формат отметки времени.Как мне этого добиться?Или есть ли лучшее решение для моего случая?

Ответы [ 3 ]

2 голосов
/ 21 мая 2019

здесь: вы будете использовать текущую дату, чтобы отфильтровать по датам праздников, взять следующую и вернуть ее имя.Я пытался сделать его настолько питонным, насколько это возможно.Любой вопрос, пожалуйста, задавайте.

import pandas as pd
import numpy as np
from pandas.compat import StringIO
from datetime import datetime
import dateutil.parser
RawData="""
date|name
01012019|Neujahr            
06012019|Heilige Drei Könige 
19042019|Karfreitag          
22042019|Ostermontag         
01052019|Tag der Arbeit      
10062019|Pfingstmontag  
14092019|Internationale Feiertage

"""
holidays = pd.read_csv(StringIO(RawData), sep="|",dtype={'date': object})
holidays['date'] = holidays['date'].astype(str).apply(lambda x: dateutil.parser.parse(x[4:8]+x[2:4]+x[0:2]))
holidays[holidays.date > datetime.now()].head(1)['name']  #compare with todays date and get the next one

Результат:

5    Pfingstmontag  
0 голосов
/ 21 мая 2019

Так как ваш date столбец является строкой, то преобразование его в объект даты

import pandas as pd df['date'] = pd.to_datetime(df['date'],format='%d%m%Y')

Это преобразовало бы date столбец в тип даты.

Затем вы можете попробовать алгоритм ближайшей даты, как указано выше, он не будет преобразован в формат отметки времени

0 голосов
/ 21 мая 2019

Вы можете преобразовать отметку времени в дату следующим образом:

import datetime
readable = datetime.datetime.fromtimestamp(1558272180)
print(readable)
2019-05-19T13:23:00

Вот ссылка с несколькими другими способами сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...