Все, что вам нужно для обработки дат и отметок времени в 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
Это конец статьи. Надеюсь, вам это понравится, и вы сможете с пользой использовать его!
Отправьте мне сообщение или оставьте ответ, если у вас есть какие-либо вопросы.
Следуйте за мной, если вы хотите получать информацию о подобных статьях в будущем!