Можно ли перевести время панды в будний день / выходные и сезон? - PullRequest
1 голос
/ 24 октября 2019

У меня есть датафрейм pandas с одним столбцом в формате datetime (year-month-day). Есть ли способ создать новую колонку с надписью выходной или будний день и колонку с указанием, какое это время года? Еще лучше (но этот кажется гораздо более сложным, поэтому не совсем необходимым) также будет, будь то федеральный праздник (США) или нет.

Например, экземпляр на дату 2019-10-23 являетсяВ среду, поэтому я хотел бы создать столбец с именем day_type, который заполняет «день недели», и столбец с именем season, который заполняет «падение».

Ответы [ 2 ]

4 голосов
/ 24 октября 2019

С strftime это просто:

import pandas as pd 

df = pd.DataFrame({'string_date': ['2019-10-23', '2019-10-24', '2019-10-23']})
df['date'] = pd.to_datetime(df['string_date'], format='%Y-%m-%d', errors='ignore')
df['day_of_week'] = df['date'].dt.strftime('%A')

Результат 1:

  string_date       date    day_of_week
0  2019-10-23   2019-10-23   Wednesday
1  2019-10-24   2019-10-24    Thursday
2  2019-10-23   2019-10-23   Wednesday

Для добавления сезона вы можете использовать эту формулу: Ссылка

df['season'] = (df['date'].dt.month%12 + 3)//3

Результат 2:

      string_date       date day_of_week  season
0  2019-10-23 2019-10-23   Wednesday       4
1  2019-10-24 2019-10-24    Thursday       4
2  2019-10-23 2019-10-23   Wednesday       4

Ссылка на Strftime: http://strftime.org/

1 голос
/ 24 октября 2019

Я написал функцию, которая принимает строковый аргумент в форме 'yyyy-mm-dd' и возвращает кортеж сезона и дня недели. Пожалуйста, измените функцию в соответствии с вашими потребностями.

from datetime import date, datetime

def date_week(date_str):
    """
    this method returns season and day of week tuple from str
    arg in the format 'yyyy-mm-dd'
    """

    datetime_obj = datetime.strptime(date_str, '%Y-%m-%d')
    weekdays = {0:'monday',
               1:'tuesday',
               2:'wednesday',
               3:'thursday',
               4:'friday',
               5:'saturday',
               6:'sunday'}
    day_of_week = weekdays[datetime_obj.weekday()]  # returns day of week


    Y = 2000 # dummy leap year to allow input X-02-29 (leap day)
    seasons = [('winter', (date(Y,  1,  1),  date(Y,  3, 20))),
               ('spring', (date(Y,  3, 21),  date(Y,  6, 20))),
               ('summer', (date(Y,  6, 21),  date(Y,  9, 22))),
               ('autumn', (date(Y,  9, 23),  date(Y, 12, 20))),
               ('winter', (date(Y, 12, 21),  date(Y, 12, 31)))]
    if isinstance(datetime_obj, datetime):
        datetime_obj = datetime_obj.date()
    datetime_obj = datetime_obj.replace(year=Y)
    season = next(season for season, (start, end) in seasons
                if start <= datetime_obj <= end)  # returns season

    return day_of_week, season

Если мы позвоним date_week("2019-10-23"), она вернет ('wednesday', 'autumn')

...