Все, что вам нужно для обработки дат и отметок времени в Pandas! Приведено много примеров.

Содержание

  • Сроки в целом

В частности, обработка операций с…

  • Дни
  • Недели
  • Месяцы
  • Годы

Дополнительно: создание диапазонов дат

  • Создать последовательные диапазоны дат
  • Создать случайные диапазоны дат

Сроки в целом

(*) Перед запуском любого кода, пожалуйста, импортируйте панды!

import pandas as pd

А теперь приступим.

Изменение формата даты в столбце DataFrame

Вы можете выбрать любой формат по своему усмотрению, следуя этой простой документации strftime.

Так, например, начиная с этого DataFrame:

Измените формат даты с помощью:

df['date'] = df['date'].apply(lambda x: pd.Timestamp(x).strftime('%Y-%m-%d'))

Или мы можем пойти немного более экзотично и сделать:

df['date'] = df['date'].apply(lambda x: pd.Timestamp(x).strftime('%B-%d-%Y %I:%M %p'))

Помните, что все варианты форматов временных меток, которые вы можете выбрать, вы можете найти по этой ссылке: strftime

Попробуй сам! Начиная с этого примера созданного DataFrame:

df = pd.DataFrame({'date': ['2018-08-09 11:10:55','2019-03-02 13:15:21']})

Изменить тип столбца - с Object / String на DateTime

# 4 possible options
# 1
df['date'] = pd.to_datetime(df['date'])
# 2
df['date'] = df['date'].astype('datetime64[ns]')
# 3
df['date'] = df['date'].apply(lambda x: parse(x))
# 4
df['date'] = df['date'].apply(lambda x: pd.Timestamp(x))

Пример (мы пробуем только один из 4 вариантов, но все они должны работать)

df = pd.DataFrame({'date': ['2018-08-09 11:10:55','2019-01-02 13:15:21']})
df
df.dtypes
df['date'] = pd.to_datetime(df['date'])
df
df.dtypes

Выход:

Переход от формата String к формату даты и от формата даты к String

Пример с изолированными переменными:

from dateutil.parser import parse
str_date = '2018-05-01'
# String to Date:
date_1 = parse(str_date)
print ('date_1: ',date_1, type(date_1))
# Date to String:
date_2 = date_1.strftime('%Y-%m-%d')
print ('date_2: ',date_2, type(date_2))

Выход:

От времени Unix / Epoch к формату даты в удобном для чтения формате

df['date'] = pd.to_datetime(df['date'],unit='s')

Пример:

df = pd.DataFrame({'date': [1349720105,1349806505]})
df
df['date'] = pd.to_datetime(df['date'],unit='s')
df

Вывод (до и после):

Сложить и вычесть даты

Используйте Timedelta! Пример:

from datetime import datetime, timedelta
from dateutil.parser import parse
parse('2019-04-07') — timedelta(days=3)
# or, to get it as a string
(parse('2019-04-07') — timedelta(days=3)).strftime('%Y-%m-%d')

Выход:

# with date format 
datetime.datetime(2019, 4, 4, 0, 0) 
# with string format
'2019-04-04'

Узнайте разницу между двумя датами

Преобразуйте обе строки в формат даты, а затем выполните расчет. Пример:

from dateutil.parser import parse
d1 = parse('2018-12-01')
d2 = parse('2018-12-08')
abs((d2 - d1).days)

Выход:

7
# 7 days

Операции с днями

Получите день от свидания

# for a column in a DataFrame
from datetime import datetime as dt
df['day'] = df['date'].dt.day
# for a single value
from dateutil.parser import parse
parse('2018-08-09').day

Выход:

9

Операции с неделями

Получить номер недели в году

Пример:

df = pd.DataFrame({'date': ['2018-08-09 11:10:55','2019-01-02 13:15:21']})
# if date column type is a string
df['week'] = pd.DatetimeIndex(df['date']).week
# if date column type is a datetime
# df['week'] = df['date'].dt.week

Выход:

(*) Чтобы создать столбец «Неделя» в формате гггг-ww, используйте:

df = pd.DataFrame({'date': ['2018-08-09 11:10:55','2019-03-02 13:15:21']})
# if column type is a string/object
df['yyyy_ww'] = pd.DatetimeIndex(df['date']).strftime('%Y-%U')
# if column type is a datetime
# df['yyyy_ww'] = df['date'].dt.strftime('%Y-%U')

И для изолированной переменной:

import datetime
date_1 = '2018-02-06'
parse(date_1).isocalendar()[1]

Выход:

6
# 6th week of the year

Получить будний день

Пример:

df['weekday'] = df['date'].apply(lambda x: parse(str(x)).strftime("%A"))

Выход:

Переход от формата год-неделя к формату гггг-мм-дд (получение первого и последнего дня недели)

Пример: вы хотите знать, какие даты были началом и концом недели номер 37 в 2018 году:

# define this function
def get_start_end_dates(yyyyww):
    year = yyyyww[:4]
    week = yyyyww[-2:]
    first_day_year = str(year) + '-' +  '01' + '-' + '01'
    d = parse(first_day_year)
    if(d.weekday()<= 3):
        d = d - timedelta(d.weekday())             
    else:
        d = d + timedelta(7-d.weekday())
    dlt = timedelta(days = (int(week)-1)*7)
    return (d + dlt).strftime('%Y-%m-%d'),  (d + dlt + timedelta(days=6)).strftime('%Y-%m-%d')
# run it
get_start_end_dates('201837')

Вывод (кортеж с началом и концом недели):

('2018-09-10', '2018-09-16')

Работа с месяцами

Получить номер месяца в году

Пример:

df = pd.DataFrame({'date': ['2018-08-09 11:10:55','2019-03-02 13:15:21']})
# if date column type is a string/object
df['month'] = pd.DatetimeIndex(df['date']).month
# if date column type is a datetime
# df['month'] = df['date'].dt.month

Выход:

И для изолированной переменной:

import datetime
date_1 = '2018-02-06'
parse(date_1).month

Выход:

2
# 2nd month of the year

(*) Чтобы создать столбец месяца в формате ГГГГ-ММ, используйте:

df = pd.DataFrame({'date': ['2018-08-09 11:10:55','2019-03-02 13:15:21']})
# if column type is a string/object
df['yyyy_mm'] = pd.DatetimeIndex(df['date']).strftime('%Y-%m')
# if column type is a datetime
# df['yyyy_mm'] = df['date'].dt.strftime('%Y-%m')

Добавить или вычесть месяцы (вернуться на X месяцев назад или вперед)

Используйте эту функцию

def monthdelta(date, delta):
    m, y = (date.month+delta) % 12, date.year + ((date.month)+delta-1) // 12
    if not m: m = 12
    d = min(date.day, [31,
        29 if y%4==0 and not y%400==0 else 28,31,30,31,30,31,31,30,31,30,31][m-1])
    new_date = (date.replace(day=d,month=m, year=y))
    return new_date.strftime('%Y-%m-%d')

Пример (вычитая 4 месяца до определенной даты):

monthdelta(parse('2019-11-09'), -4)

Вывод (показывает ту же дату, но на 4 месяца раньше):

'2019-07-09'

Операция с годами

Получите год

Пример:

df = pd.DataFrame({'date': ['2018-08-09 11:10:55','2019-03-02 13:15:21']})
# if date column type is a string/object
df['year'] = pd.DatetimeIndex(df['date']).year
# if date column type is a datetime
# df['year'] = df['date'].dt.year

И для изолированной переменной:

import datetime
date_1 = '2018-02-06'
parse(date_1).year

Выход:

2018

Сгенерировать диапазоны данных

Создать последовательные диапазоны дат

Пример: создание диапазона дат с 01.01.2019 по 01.02.2019 с почасовой частотой.

from datetime import datetime
import numpy as np
date_range = pd.date_range(start='01/01/2019', end='01/02/2019', freq='H')

Смотрите другой вариант частот здесь.

Создать случайные диапазоны дат

import random
import time
from dateutil.parser import parse
def str_time_prop(start, end, format, prop):
    stime = time.mktime(time.strptime(start, format))
    etime = time.mktime(time.strptime(end, format))
    ptime = stime + prop * (etime - stime)
    return time.strftime(format, time.localtime(ptime))
selected_format = '%Y-%m-%d %H:%M:%S'
def random_date(start, end, prop):
    return parse(str_time_prop(start, end, selected_format, prop)).strftime(selected_format)
print(random_date("2020-01-01 13:40:00", "2020-01-01 14:10:00", random.random()))
def make_date(x):
    return random_date("2012-12-01 13:40:00", "2012-12-24 14:50:00", random.random())

Вот источник этой функции.

Исходя из этого, мы можем генерировать случайные даты. Например, давайте сгенерируем список из 10 случайных отметок времени между Рождеством и Новым годом:

def make_date(x):
    return random_date("2012-12-24 00:00:00", "2012-12-31 23:59:59", random.random())
[make_date(x) for x in range(10)]

Мы также можем добавить его в любой фрейм данных, например:

df = pd.DataFrame({'number': [1,2,3,4,5]})
df['time'] = df['number'].apply(make_date)
df

Это конец статьи. Надеюсь, вам это понравится, и вы сможете с пользой использовать его!

Отправьте мне сообщение или оставьте ответ, если у вас есть какие-либо вопросы.

Следуйте за мной, если вы хотите получать информацию о подобных статьях в будущем!