С работа с датами и временем: C# и .NET | Работа с датами и временем
Работа с датой и временем
Для работы с датой и временем язык C# предусматривает структуру DateTime, описанную в пространстве имен System.
Свойства структуры DateTime
Структура DateTime содержит следующие свойства:
- Date – собственно структура типа DateTime;
- DayOfWeek – день недели – является членом перечисления DayOfWeek:
- Monday – понедельник,
- Tuesday – вторник,
- Wednesday – среда,
- Thursday – четверг,
- Friday – пятница,
- Saturday – суббота,
- Sunday – воскресенье.
- DayOfYear – целочисленное значение дня заданного года от 1 до 366.
- Hour – количество часов заданного дня от 0 до 23;
- Kind – представляет собой значение, указывающее, какое время указано текущим экземпляром структуры DateTime, является членом перечисления Kind:
- Local – местное время
- Utc – время представлено стандартом UTC.
- Unspecified – время не определено ни как местное, ни как UTC.
- Millisecond – количество миллисекунд заданной даты от 0 до 999.
- Minute – количество минут заданной даты от 0 до 59.
- Month – значение месяца заданной даты от 1 до 12.
- Second – количество секунд заданной даты от 0 до 59.
- Year – год заданной даты от 0001 до 9999.
- TimeOfDay – время дня для заданной даты (с точностью до 100 наносекунд).
- Ticks – число 100-наносекундных тактов в формате Int64 начиная с 00:00:00 1 января 0001 года.
Кроме того, структура DateTime содержит статические свойства и поля:
- Now – представляет собой свойство DateTime, содержащее текущую дату и время данного компьютера в формате местного времени.
- UtcNow — представляет собой свойство DateTime, содержащее текущую дату и время данного компьютера в формате UTC.
- Today – представляет собой текущую дату.
- MinValue – наименьшее значение типа DateTime.
- MaxValue – наибольшее значение типа DateTime.
- IsLeapYear(Int32 year) – возвращает логическое значение true если переданный год является високосным и false в противном случае.
- DaysInMonth(Int32 year, Int32 month) – возвращает количество дней в указанном месяце указанного года.
Конструкторы структуры DateTime
Структура DateTime содержит ряд конструкторов, позволяющих инициализировать объект. Наиболее часто используемые из них:
- Указанной датой — DateTime(год, месяц, день);
- Указанной датой и временем – DateTime(год, месяц, день, часы, минуты, секунды);
- Указанным 64-разрядным количеством Ticks – DateTime(Ticks).
Рассмотрим пример инициализации даты и получения ее отдельных свойств.
При попытке инициализации объекта DateTime недопустимыми значениями возникает исключение:
Ввод данных структуры DateTime
Для ввода даты и времени чаще всего используются статические методы Parse() и TryParse() структуры DateTime.
Метод Parse() в качестве аргумента принимает строку в одном из допустимых форматов для преобразования ее к объекту DateTime, который является возвращаемым значением функции. Если строку не удается корректно преобразовать в объект DateTime, возникает исключение.
Метод TryParse() принимает в качестве аргументов строку, которую необходимо преобразовать к объекту типа DateTime, а также переменную типа DateTime, обозначенную ключевым словом out, в которую необходимо сохранить преобразованную строку. Метод TryParse() является защищенным, и в случае невозможности корректного преобразования строки к формату DateTime, возвращает значение, равное 0, что соответствует дате DateTime.MiValue.
Для того чтобы узнать поддерживаемые системой форматы ввода даты и времени можно воспользоваться методом GetDateTimeFormats(), который преобразует значение объекта DateTime во все строковые представления, поддерживаемые стандартным форматом даты и времени.
Вывод данных структуры DateTime
Особого внимания заслуживает возможность форматированного вывода даты и времени. Для этого чаще всего используется перегруженный метод ToString() класса Object, который в качестве аргумента может принимать строку формата для вывода даты и времени.
Обозначение | Назначение | Варианты использования |
---|---|---|
y | год | y yy yyyy |
M | месяц | M MM MMM MMMM |
d | день | d dd ddd dddd |
h H | час (12-часовой) час(24-часовой) | h hh H HH |
m | минута | m mm |
s | секунда | s ss |
f | тик | f ff fff ffff fffff ffffff fffffff |
z | временная зона | z zz zzz |
Изменение данных структуры DateTime
Для изменения даты и времени относительно указанного значения можно воспользоваться следующими методами. Все эти методы возвращают новый объект DateTime и в качестве аргумента могут принимать как положительное, так и отрицательное значение.
- AddDays(Double) — добавляет заданное число дней (полных и неполных) к указанному значению.
- AddMonths(Int32) — добавляет заданное число месяцев к указанному значению.
- AddYears(Int32) — добавляет заданное число лет к указанному значению.
- AddHours(Double) — добавляет заданное число часов (полных и неполных) к указанному значению.
- AddMinutes(Double) — добавляет заданное число минут (полных и неполных) к указанному значению.
- AddSeconds(Double) — добавляет заданное число секунд (полных и неполных) к указанному значению.
- AddMilliseconds(Double) — добавляет заданное число миллисекунд (полных и неполных) к указанному значению.
- AddTicks(Int64) — добавляет заданное число 100-наносекундных тиков к указанному значению.
- Add(TimeSpan) — добавляет значение TimeSpan к указанному значению DateTime. Структура TimeSpan используется для представления интервала времени, которая может быть проинициализирована следующим образом:
- TimeSpan(часы, минуты, секунды)
- TimeSpan(дни, часы, минуты, секунды)
- TimeSpan(дни, часы, минуты, секунды, миллисекунды)
- TimeSpan(тики)
В примере ниже вторая строка выводится через 5 секунд после первой.
Кроме того, для изменения данных могут использоваться перегруженные операторы
- + — складывает значение объекта DateTime и временной интервал TimeSpan;
- — – вычитает значение объекта DateTime или TimeSpan из значения объекта DateTime.
Потренироваться в использовании функций работы с датой и временем Вы можете, решая задачи
Работа с датой и временем: модуль datetime
В этой статье мы разберемся, как работать с датой и временем в Python при помощи модуля datetime. И для начала давайте напишем несколько простых программ, связанных с датой и временем.
Пример 1: Получение текущей даты и времени.
import datetime datetime_object = datetime.datetime.now() print(datetime_object)
Когда вы запустите программу, результат будет примерно таким:
2020-06-29 20:30:33.139533
В этом примере мы импортировали модуль datetime с помощью оператора import datetime
.
Одним из классов, определенных в модуле datetime, является класс datetime
. После импортирования модуля мы использовали метод now()
для создания объекта datetime
, содержащего текущие локальные дату и время.
Пример 2: Получение текущей даты.
import datetime date_object = datetime.date.today() print(date_object)
Когда вы запустите программу, результат будет примерно таким:
2020-06-29
В этой программе мы использовали метод today()
, определенный в классе date
, чтобы получить объект date
, содержащий текущую локальную дату.
Что находится внутри datetime?
Мы можем использовать функцию dir()
для получения списка, содержащего все атрибуты модуля datetime.
import datetime print(dir(datetime))
Когда вы запустите программу, вывод будет следующим:
['MAXYEAR', 'MINYEAR', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'date', 'datetime', 'datetime_CAPI', 'sys', 'time', 'timedelta', 'timezone', 'tzinfo']
Наиболее часто используемыми классами в модуле datetime являются:
date
time
datetime
timedelta
Класс datetime.date
Объект date
представляет дату (год, месяц и день).
Пример 3: объект date для представления даты.
import datetime d = datetime.date(2020, 6, 29) print(d)
Когда вы запустите программу, вывод будет следующим:
2020-06-29
В приведенном выше примере date()
является конструктором класса date
. Конструктор принимает три аргумента: год, месяц и день.
Переменная d
— это объект date
.
Вы можете создавать объекты класса date
, предварительно импортировав модуль datetime, а можете импортировать только класс date
из модуля datetime. Вот как это делается:
from datetime import date a = date(2020, 6, 29) print(a) # 2020-06-29
Пример 4: Получение текущей даты.
Для получения информации о текущей дате можно воспользоваться методом today()
.
from datetime import date today = date.today() print("Current date =", today)
Когда вы запустите программу, вывод будет следующим:
Current date = 2020-06-29
Пример 5: получение даты из метки времени (timestamp).
Мы также можем создавать объекты date
из метки времени (timestamp). Термин timestamp употребляется для обозначения POSIX-времени — количества секунд, прошедшего с 00:00:00 UTC 1 января, 1970 года. Вы можете преобразовать метку времени в дату при помощи метода fromtimestamp()
.
from datetime import date timestamp = date.fromtimestamp(1326244364) print("Date =", timestamp)
Когда вы запустите программу, вывод будет следующим:
Date = 2012-01-11
Пример 6: вывод текущего года, месяца и дня.
Мы легко можем получить год, месяц, день, день недели и т. д. из объекта date
. Вот как это делается:
from datetime import date today = date.today() print("Current year:", today.year) print("Current month:", today.month) print("Current day:", today.day)
Когда вы запустите программу, результат будет примерно таким:
Current year: 2020
Current month: 6
Current day: 29
Класс datetime.time
Экземпляр класса time
представляет собой время (часы, минуты, секунды и микросекунды).
Пример 7: объект time для представления времени.
from datetime import time # time(hour = 0, minute = 0, second = 0) a = time() print("a =", a) # time(hour, minute and second) b = time(11, 34, 56) print("b =", b) # time(hour, minute and second) c = time(hour = 11, minute = 34, second = 56) print("c =", c) # time(hour, minute, second, microsecond) d = time(11, 34, 56, 234566) print("d =", d)
Когда вы запустите программу, вывод будет следующим:
a = 00:00:00
b = 11:34:56
c = 11:34:56
d = 11:34:56.234566
Пример 8: вывод часов, минут, секунд и микросекунд.
После того как вы создадите объект time
, вы можете легко получить его атрибуты, такие как часы, минуты и т. д.
from datetime import time a = time(11, 34, 56) print("hour =", a.hour) print("minute =", a.minute) print("second =", a.second) print("microsecond =", a.microsecond)
Когда вы запустите программу, вывод будет следующим:
hour = 11
minute = 34
second = 56
microsecond = 0
Обратите внимание, что мы не передали аргумент microsecond
. Следовательно, его значение по умолчанию будет равно 0.
Класс datetime.datetime
Экземпляр класса datetime
содержит информацию как о дате, так и о времени.
Пример 9: объект datetime.
from datetime import datetime #datetime(year, month, day) a = datetime(2018, 11, 28) print(a) # datetime(year, month, day, hour, minute, second, microsecond) b = datetime(2017, 11, 28, 23, 55, 59, 342380) print(b)
Когда вы запустите программу, вывод будет следующим:
2018-11-28 00:00:00
2017-11-28 23:55:59.342380
Первые три аргумента year
, month
и day
в конструкторе datetime()
являются обязательными. Отсутствующие данные будут заполнены нулями по умолчанию.
Пример 10: вывод года, месяца, часа, минуты и метки времени.
from datetime import datetime a = datetime(2017, 11, 28, 23, 55, 59, 342380) print("year =", a.year) print("month =", a.month) print("hour =", a.hour) print("minute =", a.minute) print("timestamp =", a.timestamp())
Когда вы запустите программу, вывод будет следующим:
year = 2017
month = 11
day = 28
hour = 23
minute = 55
timestamp = 1511913359.34238
Пример 11: получение текущего момента времени.
Мы можем получить информацию о текущем моменте времени не только с помощью уже упомянутого метода now()
, но и с помощью today()
.
from datetime import datetime date = datetime.today() print(date) date = datetime.now() print(date)
Когда вы запустите программу, результат будет примерно таким:
2020-06-29 20:35:33.353184
2020-06-29 20:35:33.356184
Класс datetime.timedelta
Объект timedelta
представляет разницу между двумя моментами времени.
Пример 12: разница между двумя моментами времени.
from datetime import datetime, date t1 = date(year = 2018, month = 7, day = 12) t2 = date(year = 2017, month = 12, day = 23) t3 = t1 - t2 print("t3 =", t3) t4 = datetime(year = 2018, month = 7, day = 12, hour = 7, minute = 9, second = 33) t5 = datetime(year = 2019, month = 6, day = 10, hour = 5, minute = 55, second = 13) t6 = t4 - t5 print("t6 =", t6) print("type of t3 =", type(t3)) print("type of t6 =", type(t6))
Когда вы запустите программу, вывод будет следующим:
t3 = 201 days, 0:00:00
t6 = -333 days, 1:14:20
type of t3 = <class 'datetime.timedelta'>
type of t6 = <class 'datetime.timedelta'>
Обратите внимание, что и t3
, и t6
имеют тип <class 'datetime.timedelta'>
.
Пример 13: разница между двумя объектами timedelta.
from datetime import timedelta t1 = timedelta(weeks = 2, days = 5, hours = 1, seconds = 33) t2 = timedelta(days = 4, hours = 11, minutes = 4, seconds = 54) t3 = t1 - t2 print("t3 =", t3)
Когда вы запустите программу, вывод будет следующим:
t3 = 14 days, 13:55:39
Здесь мы создали два объекта timedelta
— t1
и t2
, и их разница выводится на экран.
Пример 14: отрицательный объект timedelta.
from datetime import timedelta t1 = timedelta(seconds = 33) t2 = timedelta(seconds = 54) t3 = t1 - t2 print("t3 =", t3) print("t3 =", abs(t3))
Когда вы запустите программу, вывод будет следующим:
t3 = -1 day, 23:59:39
t3 = 0:00:21
Пример 15: интервал времени в секундах.
Вы можете получить общее количество секунд объекта timedelta
, используя метод total_seconds()
.
from datetime import timedelta t = timedelta(days = 5, hours = 1, seconds = 33, microseconds = 233423) print("total seconds =", t.total_seconds())
Когда вы запустите программу, вывод будет следующим:
total seconds = 435633.233423
Вы также можете найти сумму двух моментов времени, используя оператор +
. Кроме того, вы можете умножить и разделить объект timedelta
на целые числа и числа с плавающей точкой.
Больше информации о timedelta
вы можете найти в документации.
Формат datetime
Представление даты и времени может отличатся в разных странах, организациях и т. д. В США, например, чаще всего используется формат «мм/дд/гггг», тогда как в Великобритании более распространен формат «дд/мм/гггг».
В Python для работы с форматами есть методы strftime()
и strptime()
.
Python strftime() — преобразование объекта datetime в строку
Метод strftime()
определен в классах date
, datetime
и time
. Он создает форматированную строку из заданного объекта date
, datetime
или time
.
Пример 16: форматирование даты с использованием метода strftime().
from datetime import datetime now = datetime.now() t = now.strftime("%H:%M:%S") print("time:", t) s1 = now.strftime("%m/%d/%Y, %H:%M:%S") # mm/dd/YY H:M:S format print("s1:", s1) s2 = now.strftime("%d/%m/%Y, %H:%M:%S") # dd/mm/YY H:M:S format print("s2:", s2)
Когда вы запустите программу, результат будет примерно таким:
time: 20:43:57
s1: 06/29/2020, 20:43:57
s2: 29/06/2020, 20:43:57
Здесь %Y
, %m
, %d
, %H
и т. д. — коды для определения формата. Метод strftime()
принимает один или несколько кодов и возвращает отформатированную строку на его основе.
В приведенной выше программе переменные t
, s1
и s2
являются строками.
Основные коды для определения формата:
%Y
— год [0001, …, 2018, 2019, …, 9999]%m
— месяц [01, 02, …, 11, 12]%d
— день [01, 02, …, 30, 31]%H
— час [00, 01, …, 22, 23]%M
— минута [00, 01, …, 58, 59]%S
— секунда [00, 01, …, 58, 59]
Чтобы узнать больше о методе strftime()
и кодах форматирования, перейдите по ссылке.
Python strptime()- преобразование строки в объект datetime
Метод strptime()
создает объект datetime из заданной строки (представляющей дату и время).
Пример 17: метод strptime().
from datetime import datetime date_string = "21 June, 2018" print("date_string =", date_string) date_object = datetime.strptime(date_string, "%d %B, %Y") print("date_object =", date_object)
Когда вы запустите программу, вывод будет следующим:
date_string = 21 June, 2018
date_object = 2018-06-21 00:00:00
Метод strptime()
принимает два аргумента:
- строка, представляющая дату и время.
- формат, определяющий, каким образом части даты и времени расположены в переданной строке.
Кстати, коды %d
, %B
и %Y
используются для обозначения дня, месяца (название месяца в полном виде) и года соответственно.
Перейдите по ссылке чтобы узнать больше о методе strptime()
.
Обработка часового пояса в Python
Предположим, вы работаете над проектом и должны отображать дату и время в зависимости от часового пояса пользователей. Вместо того, чтобы пытаться обрабатывать часовой пояс самостоятельно, мы предлагаем вам использовать модуль pytZ.
from datetime import datetime import pytz local = datetime.now() print("Local:", local.strftime("%m/%d/%Y, %H:%M:%S")) tz_NY = pytz.timezone('America/New_York') datetime_NY = datetime.now(tz_NY) print("NY:", datetime_NY.strftime("%m/%d/%Y, %H:%M:%S")) tz_London = pytz.timezone('Europe/London') datetime_London = datetime.now(tz_London) print("London:", datetime_London.strftime("%m/%d/%Y, %H:%M:%S"))
Когда вы запустите программу, результат будет примерно таким:
Local: 06/29/2020, 00:16:45
NY: 06/28/2020, 17:17:00
London: 06/28/2020, 22:17:00
Здесь datetime_NY
и datetime_London
— это объекты datetime
, содержащие текущую дату и время соответствующего часового пояса.
Работа с датой и временем в Python
Python содержит несколько инструментов, которые разработчик может использовать для работы с датой и временем. В данном разделе статье мы рассмотрим модули datetime и time. Мы изучим принципы их работы и способы их применения. Начнем с модуля datetime.
Модуль datetime
Мы изучим следующие классы модуля:
- datetime.date
- datetime.timedelta
- datetime.datetime
Благодаря этим классам мы в будущем сможем работать с большей частью случаев, в которых нам понадобятся объекты date и datetime. Также существует класс tzinfo, который применяется для работы с часовыми поясами. Для дополнительной информации об этом классе вы можете обратиться к документации Python.
datetime.date
Python может представлять даты различными способами. Для начала, рассмотрим формат datetime.date, так как это один из самых простых объектов date.
print( datetime.date(2012, 13, 14) )
Traceback (most recent call last):
File «<string>», line 1, in <fragment>
builtins.ValueError: month must be in 1..12
| print( datetime.date(2012, 13, 14) )
Traceback (most recent call last): File «<string>», line 1, in <fragment> builtins.ValueError: month must be in 1..12 |
print(datetime.date(2012, 12, 14)) # datetime.date(2012, 12, 14)
| print(datetime.date(2012, 12, 14)) # datetime.date(2012, 12, 14) |
В данном коде показано, как создать простой объект даты. Класс date принимает три аргумента: год, месяц и день. Если вы укажите неправильное значение, вы увидите ошибку ValueError, как в случае выше. В противном случае вы увидите, что объект datetime.date вернулся. Давайте взглянем на еще один пример:
import datetime
d = datetime.date(2012, 12, 14)
print(d.year) # 2012
print(d.day) # 14
print(d.month) # 12
| import datetime d = datetime.date(2012, 12, 14)
print(d.year) # 2012 print(d.day) # 14 print(d.month) # 12 |
Здесь мы присваиваем объекту date переменную d. Теперь мы можем получить доступ к различным компонентам даты по названиям, таким как d.year или d.month. Давайте посмотрим, какой сейчас день:
import datetime
print(datetime.date.today()) # datetime.date(2017, 4, 5)
| import datetime
print(datetime.date.today()) # datetime.date(2017, 4, 5) |
Это может быть полезно, когда вам нужно записать, какой сейчас день. Или, если вам нужно выполнить основанный на сегодняшней дате расчет. Мелочь, а приятно.
datetime.datetime
Объект datetime.datetime содержит всю информацию объектов datetime.date плюс datetime.time. Давайте приведем несколько примеров, для лучшего понимания разницы между этим объектом, и объектом datetime.date.
import datetime
a = datetime.datetime(2017, 3, 5)
print(a) # datetime.datetime(2017, 3, 5, 0, 0)
b = datetime.datetime(2017, 3, 5, 12, 30, 10)
print(b) # datetime.datetime(2017, 3, 5, 12, 30, 10)
d = datetime.datetime(2017, 3, 5, 12, 30, 10)
print(d.year) # 2017
print(d.second) # 10
print(d.hour) # 12
| import datetime
a = datetime.datetime(2017, 3, 5) print(a) # datetime.datetime(2017, 3, 5, 0, 0)
b = datetime.datetime(2017, 3, 5, 12, 30, 10) print(b) # datetime.datetime(2017, 3, 5, 12, 30, 10)
d = datetime.datetime(2017, 3, 5, 12, 30, 10) print(d.year) # 2017 print(d.second) # 10 print(d.hour) # 12 |
Мы видим, что datetime.datetime принимает несколько дополнительных аргументов: год, месяц, день, час, минута и секунда. Это также позволяет вам указывать информацию о микросекундах и часовом поясе. При работе с базами данных, данные типы объектов будут использоваться достаточно часто. Большую часть вашей работы, вам нужно будет конвертировать форматы date или datetime Python в форматы SQL datetime или timestamp. Обратите внимание на то, что today совместно с datetime.datetime использует два разных метода:
import datetime
a = datetime.datetime.today()
print(a) # datetime.datetime(2017, 4, 5, 0, 16, 54, 989663)
b = datetime.datetime.now()
print(b) # datetime.datetime(2017, 4, 5, 0, 17, 8, 24239)
| import datetime
a = datetime.datetime.today() print(a) # datetime.datetime(2017, 4, 5, 0, 16, 54, 989663)
b = datetime.datetime.now() print(b) # datetime.datetime(2017, 4, 5, 0, 17, 8, 24239) |
Модуль datetime содержит другой метод, под названием strftime. Этот метод позволяет разработчику создавать строку, отображающую время в более понятной для человека форме. Существует целая таблица параметров форматирования, с которой рекомендуется ознакомиться в документации Python, в секции 8.1.7. Давайте взглянем на несколько примеров, показывающих всю полезность данного метода:
import datetime
a = datetime.datetime.today().strftime(«%Y%m%d»)
print(a) # ‘20170405’
today = datetime.datetime.today()
print( today.strftime(«%m/%d/%Y») ) # ’04/05/2017’
print( today.strftime(«%Y-%m-%d-%H.%M.%S») ) # 2017-04-05-00.18.00
| import datetime
a = datetime.datetime.today().strftime(«%Y%m%d») print(a) # ‘20170405’
today = datetime.datetime.today() print( today.strftime(«%m/%d/%Y») ) # ’04/05/2017′
print( today.strftime(«%Y-%m-%d-%H.%M.%S») ) # 2017-04-05-00.18.00 |
Первый пример – это скорее хитрость. В нем показано, как конвертировать сегодняшний объект datetime в строку, следующую за форматом YYYYMMDD (ГГГГММДД). Второй пример более наглядный.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
В нем мы присваиваем объект datetime переменной под названием today и применяем два разных параметра форматирования строки. Первый параметр добавляет косые черточки между элементами datetime, а также перегруппировывает datetime, теперь он делится на месяц, день и год. В последнем примере мы создаем временную отметку, которая следует типичному формату: YYYY-MM-DD.HH.MM.SS. Если вам нужно указать год как двухзначный (“YY”), вы можете заменить %Y на %y.
datetime.timedelta
Объект datetime.timedelta отображает длительность времени. Другими словами, это разница между двумя датами или временными отметками. Давайте взглянем на наглядный пример:
import datetime
# Значение: datetime.datetime(2017, 4, 5, 0, 18, 51, 980187)
now = datetime.datetime.now()
then = datetime.datetime(2017, 2, 26)
# Кол-во времени между датами.
delta = now — then
print(delta.days) # 38
print(delta.seconds) # 1131
| import datetime
# Значение: datetime.datetime(2017, 4, 5, 0, 18, 51, 980187) now = datetime.datetime.now()
then = datetime.datetime(2017, 2, 26)
# Кол-во времени между датами. delta = now — then
print(delta.days) # 38 print(delta.seconds) # 1131 |
Мы создали два объекта datetime. Один указывает на сегодняшний день, второй – на прошедшую неделю. После этого, мы берем разницу между ними. Это возвращает объект timedelta, который мы можем далее использовать, чтобы выяснить, сколько прошло дней или секунд, между этими двумя датами. Если вам нужно узнать количество часов или минут между двумя датами, вам понадобится немножко математики, чтобы выяснить это. Давайте взглянем на проверенный способ:
seconds = delta.total_seconds()
hours = seconds // 3600
print(hours) # 186.0
minutes = (seconds % 3600) // 60
print(minutes) # 13.0
| seconds = delta.total_seconds() hours = seconds // 3600
print(hours) # 186.0
minutes = (seconds % 3600) // 60 print(minutes) # 13.0 |
Отсюда мы узнаем, что в неделе 186 часов и 13 минут. Обратите внимание на то, что мы используем двойную косую черту в качестве нашего оператора деления, также известного как floor division. Теперь мы готовы к тому, чтобы узнать больше о модуле time Python.
Модуль time
Модуль time открывает разработчику Python доступ к нескольким связанным со временем функциям. Модуль основан на «эпохе», точке, с которой начинается время. Для систем Unix, эпоха началась в 1970 году. Чтобы узнать, какая эпоха в вашей системе, попробуйте запустить следующий код:
import time
print(time.gmtime(0))
| import time print(time.gmtime(0)) |
Результат
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=\
0, tm_wday=3, tm_yday=1, tm_isdst=0)
| time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=\ 0, tm_wday=3, tm_yday=1, tm_isdst=0) |
Я запустил его на Windows 7, которая также уверена в том, что начало времен датируется 1970м годом. В любом случае, в данном разделе мы ознакомимся со следующими функциями:
- time.ctime
- time.sleep
- time.strftime
- time.time
Приступим!
time.ctime
Функция time.ctime конвертирует время в секунды, начиная с эпохи, в строку, показывающую местное время. Если вы ничего не передадите данной функции, то настоящее время вернется обратно. Давайте взглянем на несколько примеров:
import time
print(time.ctime()) # ‘Wed Apr 5 00:02:49 2017’
print(time.ctime(1384112639)) # ‘Sun Nov 10 13:43:59 2013’
| import time print(time.ctime()) # ‘Wed Apr 5 00:02:49 2017’
print(time.ctime(1384112639)) # ‘Sun Nov 10 13:43:59 2013’ |
В данном коде мы показали результаты вызова функции time.ctime, как со случайным набором секунд, начиная с эпохи, так и с пустным значением. Это можно применить, к примеру, в том случае, кода кому-нибудь нужно сохранить дату в секундах, начиная с эпохи, после чего конвертировать это в более удабриваемый формат. Немного проще, сохранить большое целое число (или длинное) в базу данных, чем страдать над ним, форматируя объект datetime в какой-либо объект даты, который принимает база данных. Конечно, это также имеет свой недостаток: вам, возможно, нужно будет преобразовать целое число или значение с плавающей запятой обратно в строку.
time.sleep
Функция time.sleep дает разработчику возможность приостановить выполнение его скрипта на определенное количество секунд. Это можно сравнить с добавлением функции «Пауза» в вашу программу. Я нашел этот класс особенно полезным, когда мне нужно было подождать несколько секунд, пока закроется файл, или база данных закончит выполнять свою задачу. Давайте взглянем на пример. Откройте новое окно в IDLE и сохраните следующий код:
import time
for x in range(5):
time.sleep(2)
print(«Slept for 2 seconds»)
| import time
for x in range(5): time.sleep(2) print(«Slept for 2 seconds») |
Теперь запустите этот код в IDLE. Сделав это, вы увидите фразу «Slept for 2 seconds» пять раз, с интервалом в 2 секунды между каждым сообщением. Это очень легко в использовании!
time.strftime
Модуль time имеет функцию strftime, которая работает по схожему с версией datetime принципу. Разница заключается, главным образом, в том, что именно она принимает для ввода: кортеж, или объект struct_time, вроде тех, которые возвращаются после вызова time.gmtime() или time.localtime(). Вот небольшой пример:
import time
a = time.strftime(«%Y-%m-%d-%H.%M.%S», time.localtime())
print(a) # ‘2017-04-05-00.11.20’
| import time
a = time.strftime(«%Y-%m-%d-%H.%M.%S», time.localtime()) print(a) # ‘2017-04-05-00.11.20’ |
Этот код очень похож на код временной отметки, который мы создавали в разделе datetime. На мой взгляд, метод datetime более интуитивен при создании объекта datetime.datetime а затем при вызове его метода strftime в том формате, который вам более удобен. С модулем time, вам нужно передать формат и кортеж времени. На самом деле выбор за вами, каким именно способом вам будет удобнее решить вашу задачу.
time.time
Функция time.time отображает время в секундах, начиная с эпохи, как число с плавающей запятой. Давайте взглянем:
import time
x = time.time()
print(x) # 1491340367.478385
| import time
x = time.time() print(x) # 1491340367.478385 |
Весьма просто. Вы можете использовать данную функцию, когда вам нужно сохранить настоящее время в базу данных, но вам не нужно конвертировать его в метод datetime вашей базы данных. Вы можете вспомнить о том, что метод ctime принимает время в секундах, так что мы можем использовать time.time для получения количества секунд для передачи их ctime, вот так:
import time
a = time.ctime(time.time())
print(a) # Wed Apr 5 00:13:47 2017
| import time
a = time.ctime(time.time()) print(a) # Wed Apr 5 00:13:47 2017 |
Если вы обратитесь к документации, чтобы узнать больше о модуле time, или если вы хотите немного поэкспериментировать, вы найдете несколько способов использования данной функции.
Подведем итоги
С этого момента вы готовы работать с датой и временем в стандартных модулях Python. Работая в Python, вы получаете широкий спектр возможностей при работе с датами. Вы найдете данные модули полезными, особенно при разработке приложения, которое отслеживает встречи, или должно срабатывать в определенные дни. Также они весьма полезны при работе с базами данных.
DateTime.AddZoneDateTime.AddZone | Добавляет значение timezonehours в качестве смещения для входного значения datetime и возвращает новое значение datetimezone.Adds the timezonehours as an offset to the input datetime value and returns a new datetimezone value. |
DateTime.DateDateTime.Date | Возвращает часть даты из значения DateTime.Returns a date part from a DateTime value |
DateTime.FixedLocalNowDateTime.FixedLocalNow | Возвращает значение DateTime, равное текущей дате и времени в системе.Returns a DateTime value set to the current date and time on the system. |
DateTime.FromDateTime.From | Возвращает значение datetime из значения.Returns a datetime value from a value. |
DateTime.FromFileTimeDateTime.FromFileTime | Возвращает значение DateTime из указанного числа.Returns a DateTime value from the supplied number. |
DateTime.FromTextDateTime.FromText | Возвращает значение DateTime из набора форматов даты и значения языка и региональных параметров.Returns a DateTime value from a set of date formats and culture value. |
DateTime.IsInCurrentHourDateTime.IsInCurrentHour | Указывает, наступает ли данное значение datetime в течение текущего часа, по расчету на основе текущей системной даты и времени.Indicates whether the given datetime value occurs during the current hour, as determined by the current date and time on the system. |
DateTime.IsInCurrentMinuteDateTime.IsInCurrentMinute | Указывает, наступает ли данное значение datetime в течение текущей минуты, по расчету на основе текущей системной даты и времени.Indicates whether the given datetime value occurs during the current minute, as determined by the current date and time on the system. |
DateTime.IsInCurrentSecondDateTime.IsInCurrentSecond | Указывает, наступает ли данное значение datetime в течение текущей секунды, по расчету на основе текущей системной даты и времени.Indicates whether the given datetime value occurs during the current second, as determined by the current date and time on the system. |
DateTime.IsInNextHourDateTime.IsInNextHour | Указывает, наступает ли данное значение datetime в течение следующего часа, по расчету на основе текущей системной даты и времени.Indicates whether the given datetime value occurs during the next hour, as determined by the current date and time on the system. |
DateTime.IsInNextMinuteDateTime.IsInNextMinute | Указывает, наступает ли данное значение datetime в течение следующей минуты, по расчету на основе текущей системной даты и времени.Indicates whether the given datetime value occurs during the next minute, as determined by the current date and time on the system. |
DateTime.IsInNextNHoursDateTime.IsInNextNHours | Указывает, наступает ли данное значение datetime в течение следующего количества часов, по расчету на основе текущей системной даты и времени.Indicates whether the given datetime value occurs during the next number of hours, as determined by the current date and time on the system. |
DateTime.IsInNextNMinutesDateTime.IsInNextNMinutes | Указывает, наступает ли данное значение datetime в течение следующего количества минут, по расчету на основе текущей системной даты и времени.Indicates whether the given datetime value occurs during the next number of minutes, as determined by the current date and time on the system. |
DateTime.IsInNextNSecondsDateTime.IsInNextNSeconds | Указывает, наступает ли данное значение datetime в течение следующего количества секунд, по расчету на основе текущей системной даты и времени.Indicates whether the given datetime value occurs during the next number of seconds, as determined by the current date and time on the system. |
DateTime.IsInNextSecondDateTime.IsInNextSecond | Указывает, наступает ли данное значение datetime в течение следующей секунды, по расчету на основе текущей системной даты и времени.Indicates whether the given datetime value occurs during the next second, as determined by the current date and time on the system. |
DateTime.IsInPreviousHourDateTime.IsInPreviousHour | Указывает, наступает ли данное значение datetime в течение предыдущего часа, по расчету на основе текущей системной даты и времени.Indicates whether the given datetime value occurs during the previous hour, as determined by the current date and time on the system. |
DateTime.IsInPreviousMinuteDateTime.IsInPreviousMinute | Указывает, наступает ли данное значение datetime в течение предыдущей минуты, по расчету на основе текущей системной даты и времени.Indicates whether the given datetime value occurs during the previous minute, as determined by the current date and time on the system. |
DateTime.IsInPreviousNHoursDateTime.IsInPreviousNHours | Указывает, приходится ли заданное значение datetime на определенное число предыдущих часов, исходя из текущих даты и времени в системе.Indicates whether the given datetime value occurs during the previous number of hours, as determined by the current date and time on the system. |
DateTime.IsInPreviousNMinutesDateTime.IsInPreviousNMinutes | Указывает, приходится ли заданное значение datetime на определенное число предыдущих минут, исходя из текущих даты и времени в системе.Indicates whether the given datetime value occurs during the previous number of minutes, as determined by the current date and time on the system. |
DateTime.IsInPreviousNSecondsDateTime.IsInPreviousNSeconds | Указывает, приходится ли заданное значение datetime на определенное число предыдущих секунд, исходя из текущих даты и времени в системе.Indicates whether the given datetime value occurs during the previous number of seconds, as determined by the current date and time on the system. |
DateTime.IsInPreviousSecondDateTime.IsInPreviousSecond | Указывает, наступает ли данное значение datetime в течение предыдущей секунды, по расчету на основе текущей системной даты и времени.Indicates whether the given datetime value occurs during the previous second, as determined by the current date and time on the system. |
DateTime.LocalNowDateTime.LocalNow | Возвращает значение datetime, равное текущей дате и времени в системе.Returns a datetime value set to the current date and time on the system. |
DateTime.TimeDateTime.Time | Возвращает часть времени из значения DateTime.Returns a time part from a DateTime value. |
DateTime.ToRecordDateTime.ToRecord | Возвращает запись, содержащую части значения DateTime.Returns a record containing parts of a DateTime value. |
DateTime.ToTextDateTime.ToText | Возвращает текстовое значение из значения DateTime.Returns a text value from a DateTime value. |
#datetime#datetime | Создает значение datetime из года, месяца, дня, часов, минут и секунд.Creates a datetime value from year, month, day, hour, minute, and second. |
Основные принципы работы с датами и временем в Excel
Видео
Как обычно, кому надо быстро — смотрим видео. Подробности и нюансы — в тексте ниже:
Как вводить даты и время в Excel
Если иметь ввиду российские региональные настройки, то Excel позволяет вводить дату очень разными способами — и понимает их все:
«Классическая» форма
|
3.10.2006
|
Сокращенная форма
|
3.10.06
|
С использованием дефисов
|
3-10-6
|
С использованием дроби
|
3/10/6
|
Внешний вид (отображение) даты в ячейке может быть очень разным (с годом или без, месяц числом или словом и т.д.) и задается через контекстное меню — правой кнопкой мыши по ячейке и далее Формат ячеек (Format Cells):
Время вводится в ячейки с использованием двоеточия. Например
16:45
По желанию можно дополнительно уточнить количество секунд — вводя их также через двоеточие:
16:45:30
И, наконец, никто не запрещает указывать дату и время сразу вместе через пробел, то есть
27.10.2012 16:45
Быстрый ввод дат и времени
Для ввода сегодняшней даты в текущую ячейку можно воспользоваться сочетанием клавиш Ctrl + Ж (или CTRL+SHIFT+4 если у вас другой системный язык по умолчанию).
Если скопировать ячейку с датой (протянуть за правый нижний угол ячейки), удерживая правую кнопку мыши, то можно выбрать — как именно копировать выделенную дату:
Если Вам часто приходится вводить различные даты в ячейки листа, то гораздо удобнее это делать с помощью всплывающего календаря:
Если нужно, чтобы в ячейке всегда была актуальная сегодняшняя дата — лучше воспользоваться функцией СЕГОДНЯ (TODAY):
Как Excel на самом деле хранит и обрабатывает даты и время
Если выделить ячейку с датой и установить для нее Общий формат (правой кнопкой по ячейке Формат ячеек — вкладка Число — Общий), то можно увидеть интересную картинку:
То есть, с точки зрения Excel, 27.10.2012 15:42 = 41209,65417
На самом деле любую дату Excel хранит и обрабатывает именно так — как число с целой и дробной частью. Целая часть числа (41209) — это количество дней, прошедших с 1 января 1900 года (взято за точку отсчета) до текущей даты. А дробная часть (0,65417), соответственно, доля от суток (1сутки = 1,0)
Из всех этих фактов следуют два чисто практических вывода:
- Во-первых, Excel не умеет работать (без дополнительных настроек) с датами ранее 1 января 1900 года. Но это мы переживем! 😉
- Во-вторых, с датами и временем в Excel возможно выполнять любые математические операции. Именно потому, что на самом деле они — числа! А вот это уже раскрывает перед пользователем массу возможностей.
Количество дней между двумя датами
Считается простым вычитанием — из конечной даты вычитаем начальную и переводим результат в Общий (General) числовой формат, чтобы показать разницу в днях:
Количество рабочих дней между двумя датами
Здесь ситуация чуть сложнее. Необходимо не учитывать субботы с воскресеньями и праздники. Для такого расчета лучше воспользоваться функцией ЧИСТРАБДНИ (NETWORKDAYS) из категории Дата и время. В качестве аргументов этой функции необходимо указать начальную и конечную даты и ячейки с датами выходных (государственных праздников, больничных дней, отпусков, отгулов и т.д.):
Примечание: Эта функция появилась в стандартном наборе функций Excel начиная с 2007 версии. В более древних версиях сначала необходимо подключить надстройку Пакета анализа. Для этого идем в меню Сервис — Надстройки (Tools — Add-Ins) и ставим галочку напротив Пакет анализа (Analisys Toolpak). После этого в Мастере функций в категории Дата и время появится необходимая нам функция ЧИСТРАБДНИ (NETWORKDAYS).
Количество полных лет, месяцев и дней между датами. Возраст в годах. Стаж.
Про то, как это правильно вычислять, лучше почитать тут.
Сдвиг даты на заданное количество дней
Поскольку одни сутки в системе отсчета даты Excel принимаются за единицу (см.выше), то для вычисления даты, отстоящей от заданной на, допустим, 20 дней, достаточно прибавить к дате это число.
Сдвиг даты на заданное количество рабочих дней
Эту операцию осуществляет функция РАБДЕНЬ (WORKDAY). Она позволяет вычислить дату, отстоящую вперед или назад относительно начальной даты на нужное количество рабочих дней (с учетом выходных суббот и воскресений и государственных праздинков). Использование этой функции полностью аналогично применению функции ЧИСТРАБДНИ (NETWORKDAYS) описанной выше.
Вычисление дня недели
Вас не в понедельник родили? Нет? Уверены? Можно легко проверить при помощи функции ДЕНЬНЕД (WEEKDAY) из категории Дата и время.
Первый аргумент этой функции — ячейка с датой, второй — тип отсчета дней недели (самый удобный — 2).
Вычисление временных интервалов
Поскольку время в Excel, как было сказано выше, такое же число, как дата, но только дробная его часть, то с временем также возможны любые математические операции, как и с датой — сложение, вычитание и т.д.
Нюанс здесь только один. Если при сложении нескольких временных интервалов сумма получилась больше 24 часов, то Excel обнулит ее и начнет суммировать опять с нуля. Чтобы этого не происходило, нужно применить к итоговой ячейке формат 37:30:55:
Ссылки по теме
PHP: Функции даты и времени
I do not have much programming in php and I hope I can help those that I want to do is that when entering in the form the date 1 and the date2 I calculate if between those two dates if they have passed 5 or more years and I add 3 more days taking As reference date 2, I do not know if I understand.
To see a theoretical example date = 10/01/2012 date2 = 23/07/2017
Between these two dates have passed 5 years, 6 months, and 13 days elapsed
Knowing this my serious conditional
If they are equal or more than 5 years but less than 10 years will be added 3 days
If they are equal or more than 10 years but less than 15 years will be added 6 days
If they are equal or more than 15 years but less than 20 years will be added 9 days
If they are equal to or more than 20 years will be added 12 days
Then having the conditionals
For this example would be case as it is greater than 5 years the result that I should show taking in days like date of departure the date2 = 23/07/2017 and to this date it is added 30 days that would be a constant and depending on the years like Is the example happens 5 years would be: date2 = 23/07/2017 + 30 days = 08/30/2017 + 3 days
= End date to show = result = 02/09/2017.
But I still think how to do it if you can guide me I would appreciate a world, and everything should show without pressing buttons, if I press a button would be like to store in the database only the results otenidos as date1 date2 and result
<? Php
// $ date1 = $ _ POST [«date1»]; // this will be the first date or date of entry
// $ date2 = $ _ POST [«date2»]; // this will be the date with which you will calculate
// $ difference = $ date2 — $ date1;
// if ($ difference <= 5)
{
// echo «number of days that correspond to it [«. $ Date2 + 30 + 3. «].»;
//} else {
// ($ difference <= 5)
{
// echo «number of days corresponding to it [» $ date2 + 30 «].»;
}
Работа с датой и временем в Python
Введение
Примеры
Как спарсить строку в datetime с часовым поясом
Python 3.2+ поддерживает формат %z
при разборе строки в объекте datetime
.
UTC в форме +HHMM
или -HHMM
(пустая строка, если объект не содержит информации о временной зоне).
Python 3.x 3.2
import datetimedt = datetime.datetime.strptime("2016-04-15T08:27:18-0500", "%Y-%m-%dT%H:%M:%S%z")
Для других версий Python можно использовать внешнюю библиотеку, такую как dateutil
, которая проанализирует текст в объект datetime
.
import dateutil.parserdt = dateutil.parser.parse("2016-04-15T08:27:18-0500")
Теперь переменная dt
представляет собой объект datetime
со следующим значением:
datetime.datetime(2016, 4, 15, 8, 27, 18, tzinfo=tzoffset(None, -18000))
Простые арифметические операции с датами
Даты не существуют изолированно. Обычно нужно найти количество времени между датами или определить, какая дата будет завтра. Это можно сделать с помощью объектов timedelta
:
import datetimetoday = datetime.date.today()print('Today:', today)yesterday = today - datetime.timedelta(days=1)print('Yesterday:', yesterday)tomorrow = today + datetime.timedelta(days=1)print('Tomorrow:', tomorrow)print('Time between tomorrow and yesterday:', tomorrow - yesterday)
Получится:
Today: 2016-04-15Yesterday: 2016-04-14Tomorrow: 2016-04-16Difference between tomorrow and yesterday: 2 days, 0:00:00
Использование базовых объектов
Модуль datetime
содержит три основных типа объектов: отдельно дату, отдельно время и дату вместе со временем.
import datetime# Date objecttoday = datetime.date.today()new_year = datetime.date(2017, 01, 01) #datetime.date(2017, 1, 1)# Time objectnoon = datetime.time(12, 0, 0) #datetime.time(12, 0)# Current datetimenow = datetime.datetime.now()# Datetime objectmillenium_turn = datetime.datetime(2000, 1, 1, 0, 0, 0) #datetime.datetime(2000, 1, 1, 0, 0)
Арифметические операции для этих объектов поддерживаются только для одного и того же типа данных. Если выполнять арифметические действия с разными типами объектов, то это приведет к ошибке TypeError
.
# subtraction of noon from todaynoon-todayTraceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.date'However, it is straightforward to convert between types.# Do this insteadprint('Time since the millenium at midnight: ', datetime.datetime(today.year, today.month, today.day) - millenium_turn)# Or thisprint('Time since the millenium at noon: ', datetime.datetime.combine(today, noon) - millenium_turn)
Итерация по датам
Если нужно перебрать диапазон дат от даты начала до некоторой даты окончания, то можно использовать библиотеку datetime
и объект timedelta
:
import datetime# The size of each step in daysday_delta = datetime.timedelta(days=1)start_date = datetime.date.today()end_date = start_date + 7*day_deltafor i in range((end_date - start_date).days): print(start_date + i*day_delta)
Получится:
2016-07-212016-07-222016-07-232016-07-242016-07-252016-07-262016-07-27
Спарсить строку с двухбуквенным часовым поясом и перевести в UTC
Используя библиотеку dateutil
можно парсить временные метки с коротким буквенным именем часового пояса.
Для дат, с короткими названиями зон или аббревиатурами, которые неоднозначны или недоступны в стандартной базе данных, необходимо указать возможные буквенные обозначения между аббревиатурой часового пояса и объектом tzinfo
.
Например, CST. Это может быть Центральным стандартным временем, Стандартным временем в Китае, Стандартным временем Кубы и т.д. Полный список можно посмотреть здесь.
from dateutil import tzfrom dateutil.parser import parseET = tz.gettz('US/Eastern')CT = tz.gettz('US/Central')MT = tz.gettz('US/Mountain')PT = tz.gettz('US/Pacific')us_tzinfos = {'CST': CT, 'CDT': CT, 'EST': ET, 'EDT': ET, 'MST': MT, 'MDT': MT, 'PST': PT, 'PDT': PT}dt_est = parse('2014-01-02 04:00:00 EST', tzinfos=us_tzinfos)dt_pst = parse('2016-03-11 16:00:00 PST', tzinfos=us_tzinfos)
Дальнейшие действия:
dt_est# datetime.datetime(2014, 1, 2, 4, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Eastern'))dt_pst# datetime.datetime(2016, 3, 11, 16, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Pacific'))
При использовании с этим методом часового пояса pytz
— часовой пояс правильно не локализуется:
from dateutil.parser import parseimport pytzEST = pytz.timezone('America/New_York')dt = parse('2014-02-03 09:17:00 EST', tzinfos={'EST': EST})
Привязка часового пояса pytz
к дате и времени:
dt.tzinfo # Will be in Local Mean Time!# <DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>
Если вы используете этот метод, вы должны повторно использовать localize
для простых значений даты и времени:
dt_fixed = dt.tzinfo.localize(dt.replace(tzinfo=None))dt_fixed.tzinfo # Now it's EST.# <DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)
Создание даты и времени в разных часовых поясах
Все объекты datetime
по умолчанию не относятся ни к одному часовому поясу. Чтобы привязать их к определенному часовому поясу — им нужно назначить объект tzinfo
, который привязывает функцию даты и времени к стандарту UTC.
Пересчёт часовых поясов
Для часовых поясов, которые фиксировано смещаются относительно UTC, в Python 3.2+ в модуле datetime
есть класс timezone
в котором реализован tzinfo
, принимающий параметры timedelta
и имя (необязательно):
Python 3.x 3.2
from datetime import datetime, timedelta, timezoneJST = timezone(timedelta(hours=+9))dt = datetime(2015, 1, 1, 12, 0, 0, tzinfo=JST)print(dt)# 2015-01-01 12:00:00+09:00print(dt.tzname())# UTC+09:00dt = datetime(2015, 1, 1, 12, 0, 0, tzinfo=timezone(timedelta(hours=9), 'JST'))print(dt.tzname)# 'JST'
Для Python-версий ниже 3.2 необходимо использовать стороннюю библиотеку. Например, dateutil
. dateutil
предоставляет эквивалентный класс tzoffset
, который (tzoffset с версии 2.5.3) принимает аргументы вида dateutil.tz.tzoffset(tzname, offset)
, где offset
указано в секундах:
Python 3.x 3.2
Python 2.x 2.7
from datetime import datetime, timedeltafrom dateutil import tzJST = tz.tzoffset('JST', 9 * 3600) # 3600 seconds per hourdt = datetime(2015, 1, 1, 12, 0, tzinfo=JST)print(dt)# 2015-01-01 12:00:00+09:00print(dt.tzname)# 'JST'
Часовые пояса с переходом на летнее время
Для часовых зон с летним временем в стандартных библиотеках python нет стандартных классов. Поэтому нужно использовать стороннюю библиотеку. Есть pytz
и dateutil
— популярные библиотеки, в
Работа с датами и временем внутри ваших потоков
В прошлом месяце мы анонсировали новые действия и выражения, которые помогут вам работать с датами и временем. Узнайте больше сегодня, чтобы узнать, как использовать эти функции.
Отправка электронного письма с указанием времени
Один из распространенных сценариев — отправка электронного письма о файлах, созданных в списке OneDrive или SharePoint. Вы хотите, чтобы созданный текст времени в электронном письме находился в правильном часовом поясе для вашей компании. Однако по умолчанию в Microsoft Flow используется универсальное время (также известное как UTC или GMT).Для начала давайте создадим поток из пустого поля с помощью . При создании или изменении файла (только свойства) триггер:
Теперь выберите New Step и Add an Action . Вам будет предложено множество вариантов — сегодня мы поддерживаем более 300 различных действий. Чтобы найти действия, которые работают с датой и временем, найдите Date Time и выберите этот соединитель. Вы увидите шесть действий, которые у нас есть сегодня:
В этом сценарии давайте выберем Преобразовать часовой пояс .В свойстве Базовое время выберите Создано из меню Добавить динамическое содержимое — это будет содержать время создания файла в SharePoint в формате UTC. Обратите внимание, что все раз, выводимые любым действием, находятся в UTC.
Таким образом, для Исходный часовой пояс выберите UTC. Для Целевой часовой пояс выберите часовой пояс, который использует ваша организация. Наконец, вы можете выбрать строку удобного формата для включения в электронную почту.Мне нравится Общая дата / время , которая выглядит так: 15.06.2009 13:45.
Во-вторых, вы захотите повторить тот же процесс для Modified time файла (добавьте еще действие Convert time zone , но на этот раз выберите Modified из Dynamic content ).
Наконец, добавьте действие Отправить сообщение электронной почты . Сначала укажите, кому вы хотите отправить электронное письмо, и укажите тему письма. Затем в теле письма посмотрите на меню Добавить динамическое содержимое , и вы увидите Конвертированное время для каждого из двух добавленных вами действий:
Вы можете выбрать оба элемента, чтобы поместить их в тело электронного письма.Со всеми разнообразными свойствами в конструкторе потоков он может выглядеть так:
Сохраните свой поток! Теперь, когда вы добавляете файл в библиотеку документов, вы получите новое электронное письмо, которое выглядит следующим образом (с отображением свойств файла вверху и фактического содержимого электронной почты внизу), обратите внимание на форматирование даты и времени в Тихоокеанском Время, а не UTC:
Сложение и вычитание
Еще одна распространенная просьба — создать относительное время в вашем потоке — например, создать задачу, которая должна быть выполнена в конце дня.Мы будем использовать новые параметры в триггере Recurrence , чтобы запускать этот поток в 8 утра каждый будний день. Как и в первом потоке, создайте из пустого. На этот раз выберите триггер повторения.
Для шаблона повторения мы хотим выбрать Frequency of 1 Week (это может показаться нелогичным, поскольку поток будет выполняться более одного раза в неделю 1 ). Затем выберите Показать дополнительные параметры и выберите часовой пояс вашего бизнеса. Затем под . В эти дни выберите дни недели, и, наконец, . В эти часы выберите 8.
Теперь вы должны увидеть предварительный просмотр, в котором говорится, что запускается в 8:00 в понедельник, вторник, среду, четверг, пятницу каждую неделю.
Теперь вы можете выбрать Новый шаг и Добавить действие. В поле поиска введите Get Future Time . Для этого действия вы выбираете, сколько часов в будущем вы хотите, чтобы задача была выполнена:
Наконец, вы можете добавить задачу. Добавьте действие и выберите, где вы хотите разместить задачу (например, Todoist). Сначала вы предоставите тему.Затем выберите Срок сдачи и откройте Добавить динамическое содержимое . Здесь вы увидите результат для Future time . Выберите это, и он будет включен в качестве срока выполнения. Все готово — теперь каждый будний день вы будете получать новую задачу в конце дня.
Мы надеемся, что вы нашли эти примеры полезными. Если у вас есть какие-либо вопросы о том, как работать с датами и временем, свяжитесь с нами в сообществе.
1 Частота повторения при использовании расширенных параметров указывает, как часто повторяется общий шаблон повторения.Поскольку нам нужен один и тот же шаблон каждую неделю, интервал и частота установлены на 1 неделю. Затем внутри каждой недели у вас может быть несколько дней или даже часов для запуска триггера.
.
Работа с датой и временем в Python
Python предоставляет разработчику несколько инструментов для работы с датой и временем. В этой статье мы рассмотрим модули datetime
и time
. Мы изучим, как они работают, и некоторые общие способы их использования. Начнем с модуля datetime
!
Модуль datetime
Из модуля datetime
мы узнаем о следующих классах:
-
datetime.данные
-
datetime.timedelta
-
datetime.datetime
Они будут охватывать большинство случаев, когда вам понадобится использовать объект date
и datetime
в Python. Также существует класс tzinfo
для работы с часовыми поясами, который мы не будем рассматривать. Не стесняйтесь взглянуть на документацию Python для получения дополнительной информации об этом классе.
datetime.date
Python может представлять даты несколькими способами.Сначала мы рассмотрим формат datetime.date
, так как он является одним из самых простых объектов даты.
>>> datetime.date (2012, 13, 14)
Отслеживание (последний вызов последний):
Файл "<строка>", строка 1, в <фрагменте>
builtins.ValueError: месяц должен быть в 1..12
>>> datetime.date (2012, 12, 14)
datetime.date (2012, 12, 14)
Этот код показывает, как создать простой объект и дату
. Класс даты принимает три аргумента: год, месяц и день.Если вы передадите ему недопустимое значение, вы увидите ValueError
, как показано выше. В противном случае вы увидите возвращенный объект datetime.date
. Давайте посмотрим на другой пример:
>>> импорт дата и время
>>> d = datetime.date (2012, 12, 14)
>>> д.год
2012 г.
>>> день
14
>>> d.month
12
Здесь мы присваиваем объект даты переменной d
. Теперь мы можем получить доступ к различным компонентам даты по имени, например, d.год
или д. месяц
. А теперь давайте узнаем, какой сегодня день:
>>> datetime.date.today ()
datetime.date (2014, 3, 5)
Это может быть полезно, когда вам нужно записать, какой сегодня день. Или, возможно, вам нужно выполнить расчет на основе даты на основе сегодняшнего дня. Тем не менее, это небольшой удобный метод.
datetime.datetime
Объект datetime.datetime
содержит всю информацию из datetime.date
плюс datetime.time
объект. Давайте создадим пару примеров, чтобы лучше понять разницу между этим объектом и объектом datetime.date
.
>>> datetime.datetime (2014, 3, 5)
datetime.datetime (2014, 3, 5, 0, 0)
>>> datetime.datetime (2014, 3, 5, 12, 30, 10)
datetime.datetime (2014, 3, 5, 12, 30, 10)
>>> d = datetime.datetime (2014, 3, 5, 12, 30, 10)
>>> д.год
2014 г.
>>> d.second
10
>>> d.hour
12
Здесь мы видим datetime.datetime
принимает несколько дополнительных аргументов: год, месяц, день, час, минуту и секунду. Он также позволяет указать информацию о микросекундах и часовом поясе. Когда вы работаете с базами данных, вы часто будете использовать эти типы объектов. В большинстве случаев вам нужно будет преобразовать формат даты Python или datetime
в формат SQL datetime
или timestamp
. Вы можете узнать, что сегодня происходит с datetime.datetime
, используя два разных метода:
>>> дата и время.datetime.today ()
datetime.datetime (2014, 3, 5, 17, 56, 10, 737000)
>>> datetime.datetime.now ()
datetime.datetime (2014, 3, 5, 17, 56, 15, 418000)
В модуле datetime
есть еще один метод, о котором вы должны знать, — strftime
. Этот метод позволяет разработчику создать строку, представляющую время в более удобочитаемом формате. Есть целая таблица параметров форматирования, которую вы должны прочитать в документации Python, раздел 8.1.7. Мы рассмотрим несколько примеров, чтобы показать вам возможности этого метода:
>>> datetime.datetime.today (). Strftime ("% Y% m% d")
'20140305'
>>> сегодня = datetime.datetime.today ()
>>> today.strftime ("% m /% d /% Y")
'03 / 05/2014 '
>>> today.strftime ("% Y-% m-% d-% H.% M.% S")
'2014-03-05-17.59.53'
Первый пример — своего рода взлом. В нем показано, как преобразовать сегодняшний объект datetime
в строку, соответствующую формату ГГГГММДД (год, месяц, день).Второй пример лучше. Здесь мы назначаем сегодняшний объект datetime
переменной с именем today
, а затем пробуем две разные операции форматирования строк. Первый добавляет косые черты между элементами datetime
, а также переупорядочивает его так, чтобы он стал месяц, день, год . В последнем примере создается своего рода метка времени в довольно типичном формате: ГГГГ-ММ-ДД.ЧЧ.ММ.СС . Если вы хотите перейти к двузначному году, вы можете заменить % и
на % и
.
datetime.timedelta
Объект datetime.timedelta
представляет продолжительность времени. Другими словами, это разница между двумя датами или временем. Давайте посмотрим на простой пример:
>>> сейчас = datetime.datetime.now ()
>>> сейчас
datetime.datetime (2014, 3, 5, 18, 13, 51, 230000)
>>> затем = datetime.datetime (2014, 2, 26)
>>> delta = сейчас - потом
>>> тип (дельта)
<тип 'datetime.timedelta'>
>>> дельта.дней
7
>>> delta.seconds
65631
Здесь мы создаем два объекта datetime
. Один на сегодня и один неделю назад. Затем мы берем разницу между ними. Это возвращает объект timedelta
, который затем можно использовать для определения количества дней или секунд между двумя датами. Если вам нужно знать количество часов или минут между ними, вам придется использовать математику, чтобы это вычислить. Вот один из способов сделать это:
>>> секунды = дельта.total_seconds ()
>>> часы = секунды // 3600
>>> часы
186,0
>>> минут = (секунд% 3600) // 60
>>> минут
13,0
Это говорит нам о том, что в неделе 186 часов 13 минут. Обратите внимание, что мы используем двойную косую черту в качестве оператора деления. Это называется разделением этажей.
Теперь мы готовы двигаться дальше и немного узнать о модуле time
!
Модуль времени
Модуль time
предоставляет разработчику Python доступ к различным функциям, связанным со временем.Модуль времени основан на том, что он называется эпохой, моментом начала времени. Для систем Unix эпоха была в 1970 году. Чтобы узнать, какая эпоха в вашей системе, попробуйте запустить следующее:
>>> время импорта
>>> time.gmtime (0)
time.struct_time (tm_year = 1970, tm_mon = 1, tm_mday = 1, tm_hour = 0, tm_min = 0,
tm_sec = 0, tm_wday = 3, tm_yday = 1, tm_isdst = 0)
Я запускал это в Windows 7, и мне тоже кажется, что время началось в 1970 году.В любом случае, в этом разделе мы будем изучать следующие функции, связанные со временем:
-
время.ctime
-
время. Сон
-
time.strftime
-
время. Время
Приступим!
time.ctime
Функция time.ctime
преобразует время в секундах, прошедшее с начала эпохи, в строку, представляющую местное время. Если ничего не передать, то возвращается текущее время.Давайте попробуем пару примеров:
>>> время импорта
>>> time.ctime ()
'Чт, 06 марта, 07:28:48 2014'
>>> time.ctime (1384112639)
'Вс 10 ноя 13:43:59 2013'
Здесь мы показываем результаты вызова ctime
вообще с пустым звуком и с довольно случайным количеством секунд с начала эпохи. Я видел что-то вроде того, что использовалось, когда кто-то сохранял дату в секундах с начала эпохи, а затем они хотели преобразовать ее во что-то, что может понять человек.Немного проще сохранить большое целое (или длинное) число в базе данных, чем возиться с форматированием его из объекта datetime
в любой объект даты, который принимает база данных. Конечно, у этого также есть недостаток, заключающийся в том, что вам нужно преобразовать целое число или значение с плавающей запятой обратно в строку.
время сна
Функция time.sleep
дает разработчику возможность приостановить выполнение вашего скрипта на заданное количество секунд. Это все равно, что добавить паузу в вашу программу.Я нашел это лично полезным, когда мне нужно подождать секунду, пока файл завершит закрытие или фиксация базы данных завершится. Давайте посмотрим на пример. Откройте новое окно в IDLE и сохраните следующий код:
время импорта
для x в диапазоне (5):
время сна (2)
print («Спал 2 секунды»)
Теперь запустите код в IDLE. Вы можете сделать это, перейдя в меню Run , а затем выбрав пункт меню Run module .Когда вы это сделаете, вы увидите, что он пять раз распечатывает фразу * Спал 2 секунды * с двухсекундной паузой между каждым отпечатком. Это действительно так просто!
time.strftime
Модуль time
имеет функцию strftime
, которая работает почти так же, как версия datetime
. Разница в основном заключается в том, что он принимает для ввода: кортеж или объект struct_time
, как те, которые возвращаются, когда вы вызываете time.gmtime ()
или time.localtime ()
. Вот небольшой пример:
>>> time.strftime ("% Y-% m-% d-% H.% M.% S",
time.localtime ())
'2014-03-06-20.35.56'
Этот код очень похож на код временной метки, который мы создали в части datetime
этой главы. Я думаю, что метод datetime
немного более интуитивно понятен, поскольку вы просто создаете объект datetime.datatime
, а затем вызываете его метод strftime
в желаемом формате.С модулем времени вы должны передать формат плюс кортеж времени. Вам действительно решать, какой из них наиболее подходит для вас.
время. Время
Функция time.time
вернет время в секундах с начала эпохи в виде числа с плавающей запятой. Давайте посмотрим:
>>> time.time ()
1394199262.318
Это было довольно просто. Вы можете использовать это, когда хотите сохранить текущее время в базе данных, но не хотите беспокоиться о преобразовании его в метод базы данных datetime
.Вы также можете вспомнить, что метод ctime
принимает время в секундах, поэтому мы могли бы использовать time.time
, чтобы получить количество секунд для передачи ctime
, например:
>>> time.ctime (time.time ())
'Пт, 07 мар, 07:36:38 2014'
Если вы немного покопаетесь в документации по модулю времени или немного поэкспериментируете с ним, вы, вероятно, найдете несколько других применений этой функции.
Завершение
На этом этапе вы должны знать, как работать с датой и временем, используя стандартные модули Python.Python дает вам много возможностей, когда дело доходит до работы с датами. Вы найдете эти модули полезными, если вам когда-нибудь понадобится создать приложение, которое отслеживает встречи или которое должно запускаться в определенные дни. Они также полезны при работе с базами данных.
.
Работа с датой и временем — документация XlsxWriter
Дата и время в Excel представлены действительными числами, например «1 января.
2013 12:00 »представлен числом 41275.5.
Целая часть числа хранит количество дней с начала эпохи и
дробная часть хранит процент дня.
Дата или время в Excel такие же, как и любые другие числа. Чтобы отобразить номер как
дату, к которой необходимо применить числовой формат Excel. Вот несколько примеров:
импорт xlsxwriter workbook = xlsxwriter.Книга ('date_examples.xlsx') рабочий лист = workbook.add_worksheet () # Расширить столбец A для большей наглядности. рабочий лист.set_column ('A: A', 30) # Число, которое нужно преобразовать в дату. число = 41333,5 # Запишите это число без форматирования. worksheet.write ('A1', число) # 41333.5 format2 = workbook.add_format ({'num_format': 'дд / мм / гг'}) worksheet.write ('A2', число, формат2) # 28/02/13 format3 = workbook.add_format ({'num_format': 'мм / дд / гг'}) worksheet.write ('A3', число, формат3) # 28.02.13 format4 = книга.add_format ({'num_format': 'д-м-гггг'}) worksheet.write ('A4', число, формат4) # 28-2-2013 format5 = workbook.add_format ({'num_format': 'дд / мм / гг чч: мм'}) worksheet.write ('A5', число, формат5) # 28.02.13 12:00 format6 = workbook.add_format ({'num_format': 'd mmm yyyy'}) worksheet.write ('A6', number, format6) # 28 фев 2013 г. format7 = workbook.add_format ({'num_format': 'ммм д гггг чч: мм AM / PM'}) worksheet.write ('A7', number, format7) # 28 февраля 2013 г. 12:00 workbook.close ()
Чтобы немного упростить работу с датой и временем, модуль XlsxWriter
предоставляет метод write_datetime ()
для записи дат в стандартной библиотеке
datetime
формат.
В частности, он поддерживает объекты datetime типа datetime.datetime
,
datetime.date
, datetime.time
и datetime.timedelta
.
Есть много способов создания объектов datetime, например
datetime.datetime.strptime ()
метод:
date_time = datetime.datetime.strptime ('2013-01-23', '% Y-% m-% d')
Для получения информации о других методах создания даты и времени см. Документацию datetime
.
Как объяснялось выше, вам также необходимо создать числовой формат и применить его к форматированию
дата / время:
.
16 Даты и время | R для науки о данных
Введение
Эта глава покажет вам, как работать с датой и временем в R. На первый взгляд даты и время кажутся простыми. Вы используете их все время в своей обычной жизни, и, похоже, они не вызывают большого затруднения. Однако чем больше вы узнаете о датах и времени, тем сложнее они становятся. Чтобы разогреться, задайте эти три, казалось бы, простых вопроса:
- В каждом году 365 дней?
- У каждого дня 24 часа?
- В каждой минуте 60 секунд?
Я уверен, что вы знаете, что не в каждом году 365 дней, но знаете ли вы полное правило определения того, является ли год високосным? (Он состоит из трех частей.Возможно, вы вспомнили, что во многих частях мира используется летнее время (DST), так что в одних днях 23 часа, а в других 25. Возможно, вы не знали, что в некоторых минутах 61 секунда, потому что время от времени возникают дополнительные секунды. добавляются, потому что вращение Земли постепенно замедляется.
Даты и время трудны, потому что они должны согласовать два физических явления (вращение Земли и ее орбиту вокруг Солнца) с целым набором геополитических явлений, включая месяцы, часовые пояса и летнее время.Эта глава не научит вас всем до мельчайших подробностей о датах и времени, но даст вам прочную основу для практических навыков, которые помогут вам с общими проблемами анализа данных.
Предварительные требования
В этой главе основное внимание уделяется пакету lubridate , который упрощает работу с датой и временем в R. lubridate не является частью ядра tidyverse, потому что он вам нужен только тогда, когда вы работаете с датой / временем. Нам также понадобится nycflights13 для тренировочных данных.
Дата / время создания
Существует три типа данных даты / времени, которые относятся к моменту времени:
А дата . Тибблс напечатает это как
<дата>
.A время в течение суток. Тибблс напечатает это как
<время>
.Дата-время — это дата плюс время: он однозначно определяет
момент времени (обычно с точностью до секунды). Tibbles распечатайте это
как
это очень полезное имя.
В этой главе мы сосредоточимся только на датах и дате, поскольку в R нет собственного класса для хранения времени. Если он вам нужен, вы можете использовать пакет hms .
Вы всегда должны использовать самый простой тип данных, который подходит для ваших нужд. Это означает, что если вы можете использовать дату вместо даты и времени, вам следует это сделать. Дата и время значительно сложнее из-за необходимости обрабатывать часовые пояса, к которым мы вернемся в конце главы.
Чтобы получить текущую дату или дату и время, вы можете использовать сегодня ()
или сейчас ()
:
В противном случае есть три способа указать дату / время:
- Из струны.
- Из отдельных компонентов даты и времени.
- Из существующего объекта даты / времени.
Работают они следующим образом.
Из струн
Дата / время часто поступают в виде строк. Вы видели один подход к синтаксическому анализу строк на дату и время в дате и времени.Другой подход — использовать помощники, предоставляемые lubridate. Они автоматически определяют формат после того, как вы укажете порядок компонентов. Чтобы использовать их, определите порядок, в котором год, месяц и день появляются в ваших датах, а затем расположите «y», «m» и «d» в том же порядке. Это дает вам имя функции lubridate, которая будет анализировать вашу дату. Например:
Эти функции также принимают числа без кавычек. Это наиболее краткий способ создания единого объекта даты / времени, который может вам понадобиться при фильтрации данных даты / времени. ymd ()
коротко и однозначно:
ymd ()
и друзья создают даты. Чтобы создать дату и время, добавьте подчеркивание и один или несколько символов «h», «m» и «s» к имени функции синтаксического анализа:
Вы также можете принудительно создать дату и время с даты, указав часовой пояс:
Из отдельных компонентов
Вместо одной строки иногда отдельные компоненты даты и времени разбросаны по нескольким столбцам.Вот что у нас есть в данных о рейсах:
Чтобы создать дату / время из этого типа ввода, используйте make_date ()
для дат или make_datetime ()
для даты и времени:
полетов%>%
выберите (год, месяц, день, час, минута)%>%
mutate (отход = make_datetime (год, месяц, день, час, минута))
#> # Таблица: 336,776 x 6
#> год месяц день час минута отправление
#>
#> 1 2013 1 1 5 15 2013-01-01 05:15:00
#> 2 2013 1 1 5 29 2013-01-01 05:29:00
#> 3 2013 1 1 5 40 2013-01-01 05:40:00
#> 4 2013 1 1 5 45 2013-01-01 05:45:00
#> 5 2013 1 1 6 0 2013-01-01 06:00:00
#> 6 2013 1 1 5 58 2013-01-01 05:58:00
#> #… С еще 336 770 строками
Давайте сделаем то же самое для каждого из четырех столбцов времени в рейсах
.Время представлено в немного странном формате, поэтому мы используем арифметику модуля для извлечения компонентов часа и минуты. Создав переменные даты и времени, я сосредотачиваюсь на переменных, которые мы рассмотрим в оставшейся части главы.
make_datetime_100 <- функция (год, месяц, день, время) {
make_datetime (год, месяц, день, время% /% 100, время %% 100)
}
flight_dt <- рейсы%>%
фильтр (! is.na (dep_time),! is.na (arr_time))%>%
мутировать (
dep_time = make_datetime_100 (год, месяц, день, dep_time),
arr_time = make_datetime_100 (год, месяц, день, arr_time),
sched_dep_time = make_datetime_100 (год, месяц, день, sched_dep_time),
sched_arr_time = make_datetime_100 (год, месяц, день, sched_arr_time)
)%>%
select (origin, dest, end_with ("delay"), end_with ("time"))
flight_dt
#> # Таблица: 328 063 x 9
#> origin dest dep_delay arr_delay dep_time sched_dep_time
#>
#> 1 EWR IAH 2 11 2013-01-01 05:17:00 2013-01-01 05:15:00
#> 2 LGA IAH 4 20 2013-01-01 05:33:00 2013-01-01 05:29:00
#> 3 JFK MIA 2 33 2013-01-01 05:42:00 2013-01-01 05:40:00
#> 4 JFK BQN -1-18 2013-01-01 05:44:00 2013-01-01 05:45:00
#> 5 LGA ATL -6-25 2013-01-01 05:54:00 2013-01-01 06:00:00
#> 6 EWR ORD -4 12 2013-01-01 05:54:00 2013-01-01 05:58:00
#> #… С еще 328 057 строками и еще 3 переменными: arr_time ,
#> # sched_arr_time , air_time
С этими данными я могу визуализировать распределение времени отправления по году:
Или в течение одного дня:
Обратите внимание, что когда вы используете дату и время в числовом контексте (например, в гистограмме), 1 означает 1 секунду, поэтому ширина бина 86400 означает один день.Для фиников 1 означает 1 день.
Из других типов
Вы можете переключаться между датой-временем и датой. Это работа as_datetime ()
и as_date ()
:
Иногда вы получаете дату / время в виде числовых смещений из «Эпохи Unix», 1970-01-01. Если смещение указано в секундах, используйте as_datetime ()
; если в днях, используйте as_date ()
.
Упражнения
Что произойдет, если вы проанализируете строку, содержащую недопустимые даты?
Что делает аргумент
tzone
длясегодня ()
? Почему это важно?Используйте соответствующую функцию lubridate для анализа каждой из следующих дат:
Компоненты даты и времени
Теперь, когда вы знаете, как получить данные о дате и времени в структуры данных даты и времени R, давайте посмотрим, что вы можете с ними делать.В этом разделе основное внимание будет уделено функциям доступа, которые позволяют вам получать и устанавливать отдельные компоненты. В следующем разделе мы рассмотрим, как арифметика работает с датой и временем.
Получение комплектующих
Вы можете выдвинуть отдельные части даты с помощью дополнительных функций год ()
, месяц ()
, mday ()
(день месяца), yday ()
(день года), wday ()
(день недели), час ()
, минуты ()
и секунды ()
.
Для month ()
и wday ()
вы можете установить label = TRUE
, чтобы возвращать сокращенное название месяца или дня недели. Установите abbr = FALSE
, чтобы вернуть полное имя.
Мы можем использовать wday ()
, чтобы увидеть, что в будние дни отправляется больше рейсов, чем в выходные:
Есть интересная картина, если мы посмотрим на среднюю задержку отправления по минутам в течение часа. Похоже, у рейсов, отправляющихся через 20-30 и 50-60 минут, задержки намного меньше, чем в остальное время!
Интересно, что если мы посмотрим на время отправления по расписанию , мы не увидим такой четкой закономерности:
Так почему же мы видим эту закономерность с фактическим временем отправления? Что ж, как и многие другие данные, собираемые людьми, существует сильная предвзятость в отношении рейсов, вылетающих в «хорошее» время вылета.Всегда будьте бдительны в отношении такого рода закономерностей, когда вы работаете с данными, предполагающими человеческое суждение!
Округление
Альтернативный подход к нанесению на график отдельных компонентов — округление даты до ближайшей единицы времени с floor_date ()
, round_date ()
и roof_date ()
. Каждая функция принимает вектор дат для настройки, а затем имя единицы округляется в меньшую сторону (пол), в большую сторону (потолок) или до. Это, например, позволяет нам построить количество рейсов в неделю:
Особенно полезно вычисление разницы между округленной и неокругленной датой.
Установочные компоненты
Вы также можете использовать каждую функцию доступа для установки компонентов даты / времени:
В качестве альтернативы, вместо изменения на месте, вы можете создать новую дату и время с помощью update ()
. Это также позволяет одновременно устанавливать несколько значений.
Если значения слишком большие, они будут перенесены:
Вы можете использовать update ()
, чтобы показать распределение рейсов в течение дня для каждого дня года:
Установка константы для больших компонентов даты — это мощный метод, позволяющий исследовать закономерности в более мелких компонентах.
Упражнения
Каким образом распределение времени полета в течение дня меняется в
курс года?Сравните
dep_time
,sched_dep_time
иdep_delay
. Последовательны ли они?
Объясните свои выводы.Сравните
air_time
с продолжительностью между отправлением и прибытием.
Объясните свои выводы. (Подсказка: учитывайте расположение аэропорта.)Как меняется среднее время задержки в течение дня?
Что следует использовать:dep_time
илиsched_dep_time
? Почему?В какой день недели нужно уезжать, если вы хотите минимизировать
шанс задержки?Что делает распределение алмазов
$ карат
и
рейсы $ sched_dep_time
похожи?Подтвердите мою гипотезу о том, что ранние вылеты рейсов за считанные минуты
20-30 и 50-60 вызваны ранним вылетом регулярных рейсов.Подсказка: создайте двоичную переменную, которая сообщает вам, есть ли полет
было отложено.
Временные интервалы
Далее вы узнаете, как работает арифметика с датами, включая вычитание, сложение и деление. Попутно вы узнаете о трех важных классах, которые представляют промежутки времени:
- длительности , которые представляют точное количество секунд.
- период , которые представляют человеческие единицы, такие как недели и месяцы.
- интервалы , которые представляют начальную и конечную точки.
Длительность
В R, когда вы вычитаете две даты, вы получаете объект difftime:
Объект класса difftime записывает промежуток времени в секундах, минутах, часах, днях или неделях. Эта неоднозначность может сделать работу с difftimes немного болезненной, поэтому lubridate предоставляет альтернативу, которая всегда использует секунды: продолжительность .
Durations идут с кучей удобных конструкторов:
Длительности всегда записывают промежуток времени в секундах.Более крупные единицы создаются путем преобразования минут, часов, дней, недель и лет в секунды со стандартной скоростью (60 секунд в минуту, 60 минут в час, 24 часа в день, 7 дней в неделю, 365 дней в год).
Продолжительность можно складывать и умножать:
Вы можете складывать и вычитать продолжительность до и из дней:
Однако, поскольку длительность представляет собой точное количество секунд, иногда вы можете получить неожиданный результат:
Почему один день после 13:00 12 марта, 14:00 13 марта ?! Если вы внимательно посмотрите на дату, вы также можете заметить, что часовые пояса изменились.Из-за летнего времени 12 марта имеет только 23 часа, поэтому, если мы добавим секунды, равные полным дням, мы получим другое время.
Периоды
Для решения этой проблемы lubridate предоставляет период . Периоды — это промежутки времени, но они не имеют фиксированной длины в секундах, вместо этого они работают с «человеческим» временем, например днями и месяцами. Это позволяет им работать более интуитивно:
Как и длительности, периоды могут быть созданы с помощью ряда удобных функций конструктора.
Периоды можно складывать и умножать:
И, конечно, добавить их к датам.По сравнению с продолжительностью периоды с большей вероятностью сделают то, что вы ожидаете:
Давайте использовать точки, чтобы исправить странность, связанную с датами наших рейсов. Некоторые самолеты, похоже, прибыли в пункт назначения до того, как вылетели из Нью-Йорка.
Это ночные рейсы. Мы использовали ту же информацию о дате и для времени вылета, и для времени прибытия, но эти рейсы прибыли на следующий день. Мы можем исправить это, добавив дня (1)
ко времени прибытия каждого ночного рейса.
Теперь все наши полеты подчиняются законам физики.
flight_dt%>%
фильтр (ночь, arr_time # Табл: 0 x 10
#> #… С 10 переменными: origin , dest , dep_delay ,
#> # arr_delay , dep_time , sched_dep_time , arr_time ,
#> # sched_arr_time , air_time , ночь
Интервалы
Очевидно, что dyears (1) / ddays (365)
должны вернуть: единицу, потому что длительность всегда представлена числом секунд, а продолжительность года определяется как 365 дней в секундах.
Что должно вернуть года (1) / дней (1)
? Что ж, если был 2015 год, он должен вернуть 365, но если это был 2016, он должен вернуть 366! Для lubridate недостаточно информации, чтобы дать однозначный ответ. Вместо этого он дает оценку с предупреждением:
Если вы хотите получить более точное измерение, вам нужно использовать интервал . Интервал — это продолжительность с начальной точкой: это делает его точным, чтобы вы могли точно определить, сколько он длится:
Чтобы узнать, сколько периодов попадает в интервал, нужно использовать целочисленное деление:
Сводка
Как выбрать продолжительность, периоды и интервалы? Как всегда, выберите самую простую структуру данных, которая решит вашу проблему.Если вас интересует только физическое время, используйте продолжительность; если вам нужно добавить человеческое время, используйте точку; если вам нужно выяснить, какова длина диапазона в человеческих единицах, используйте интервал.
На рисунке 16.1 приведены разрешенные арифметические операции между различными типами данных.
Рисунок 16.1: Разрешенные арифметические операции между парами классов даты / времени.
Упражнения
Почему есть
месяца ()
, но нетмесяца ()
?Объясните
дня (ночь * 1)
тому, кто только начал
изучение Р.Как это работает?Создайте вектор дат первого числа каждого месяца 2015 года.
Создайте вектор дат с указанием первого числа каждого месяца
в текущий год.Напишите функцию, которая, учитывая ваш день рождения (как дату), возвращает
сколько вам лет в годах.Почему
(сегодня ()% -% (сегодня () + годы (1))) / мес. (1)
не работает?
Часовые пояса
Часовые пояса — чрезвычайно сложная тема из-за их взаимодействия с геополитическими объектами.К счастью, нам не нужно вдаваться в подробности, поскольку не все они важны для анализа данных, но есть несколько проблем, которые нам нужно будет решить.
Первая проблема заключается в том, что повседневные названия часовых поясов имеют тенденцию быть двусмысленными. Например, если вы американец, вы, вероятно, знакомы с EST или восточным стандартным временем. Однако и в Австралии, и в Канаде также есть EST! Во избежание путаницы R использует часовой пояс международного стандарта IANA. В них используется согласованная схема именования «/», обычно в форме «<континент> / <город>» (есть несколько исключений, потому что не все страны расположены на континенте).Примеры включают «Америка / Нью-Йорк», «Европа / Париж» и «Тихоокеанский регион / Окленд».
Вы можете задаться вопросом, почему часовой пояс использует город, если обычно вы думаете о часовых поясах как связанных со страной или регионом внутри страны. Это потому, что база данных IANA должна записывать правила часовых поясов на десятилетия. В течение десятилетий страны довольно часто меняют названия (или разделяются), но названия городов, как правило, остаются прежними. Другая проблема заключается в том, что имя должно отражать не только текущее поведение, но и всю историю.Например, есть часовые пояса для «Америка / Нью-Йорк» и «Америка / Детройт». Оба этих города в настоящее время используют стандартное восточное время, но в 1969-1972 годах Мичиган (штат, в котором расположен Детройт) не переходил на летнее время, поэтому ему нужно другое название. Стоит прочитать исходную базу данных часовых поясов (доступную на http://www.iana.org/time-zones), чтобы прочитать некоторые из этих историй!
Вы можете узнать, какой R считает ваш текущий часовой пояс, с помощью Sys.timezone ()
:
(Если R не знает, вы получите NA
.)
И посмотрите полный список имен всех часовых поясов с помощью OlsonNames ()
:
В R часовой пояс — это атрибут даты и времени, который управляет только печатью. Например, эти три объекта представляют один и тот же момент времени:
.
Вы можете проверить, что они совпадают, используя вычитание:
Если не указано иное, lubridate всегда использует UTC. UTC (всемирное координированное время) — это стандартный часовой пояс, используемый научным сообществом и примерно эквивалентный своему предшественнику по Гринвичу (GMT).У него нет DST, что делает его удобным для вычислений. Операции, которые объединяют дату и время, например c ()
, часто теряют часовой пояс. В этом случае дата и время будут отображаться в вашем часовом поясе:
.
Вы можете изменить часовой пояс двумя способами:
.