Преобразование любой строки на сегодняшний день [дубликат]

Я смог решить проблему, выполнив следующие шаги: a. обновить до последней версии chrome, очистить кеш и закрыть браузер Chrome. Загрузите последнюю версию Selenium 3.0

1568
задан Maxime Lorant 11 June 2016 в 15:33
поделиться

16 ответов

datetime.strptime - основная процедура для разбора строк в datetimes. Он может обрабатывать всевозможные форматы с форматом, определяемым строкой формата, которую вы ему даете:

from datetime import datetime

datetime_object = datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

Результирующий объект datetime является наименее частым.

Ссылки:

Примечания:

  • strptime = "время синтаксического разбора"
  • strftime = "время форматирования строки"
  • Произнести его вслух сегодня и amp; вам не придется искать его через 6 месяцев.
2424
ответ дан user2357112 19 August 2018 в 05:58
поделиться
  • 1
    почему это возвращает объект date_object, а не объект datetime_object? – jononomo 28 April 2014 в 20:07
  • 2
    '% b', '% p' ​​может не работать в неанглийском языке. – jfs 29 April 2014 в 11:55
  • 3
    @User Вам нужно знать заранее, чтобы исключить эту часть строки формата, но если вы хотите date вместо datetime, то через datetime это будет прекрасно: datetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1) – Izkata 11 November 2014 в 21:02
  • 4
    Если вы знаете, что строка представляет собой datetime в UTC, вы можете получить объект datetime с помощью часового пояса, добавив эту строку в Python 3: from datetime import timezone; datetime_object = datetime_object.replace(tzinfo=timezone.utc) – Flimm 8 December 2016 в 11:28
  • 5
    Я искал "%Y-%m-%d %H:%M:%S" – Martin Thoma 7 December 2017 в 14:56

Вот два решения, использующие Pandas для преобразования дат, отформатированных как строки в объекты datetime.date.

import pandas as pd

dates = ['2015-12-25', '2015-12-26']

# 1) Use a list comprehension.
>>> [d.date() for d in pd.to_datetime(dates)]
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]

# 2) Convert the dates to a DatetimeIndex and extract the python dates.
>>> pd.DatetimeIndex(dates).date.tolist()
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]

Сроки

dates = pd.DatetimeIndex(start='2000-1-1', end='2010-1-1', freq='d').date.tolist()

>>> %timeit [d.date() for d in pd.to_datetime(dates)]
# 100 loops, best of 3: 3.11 ms per loop

>>> %timeit pd.DatetimeIndex(dates).date.tolist()
# 100 loops, best of 3: 6.85 ms per loop

И вот как преобразовать OP исходные даты-времени:

datetimes = ['Jun 1 2005  1:33PM', 'Aug 28 1999 12:00AM']

>>> pd.to_datetime(datetimes).to_pydatetime().tolist()
[datetime.datetime(2005, 6, 1, 13, 33), 
 datetime.datetime(1999, 8, 28, 0, 0)]

Существует много вариантов преобразования строк из Pandas Timestamps с помощью to_datetime, поэтому проверьте docs , если вам что-то особенное.

Аналогично, метки времени имеют много свойств и методов , к которым можно получить доступ в дополнение к .date

19
ответ дан Alexander 19 August 2018 в 05:58
поделиться

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

import time

def num_suffix(n):
    '''
    Returns the suffix for any given int
    '''
    suf = ('th','st', 'nd', 'rd')
    n = abs(n) # wise guy
    tens = int(str(n)[-2:])
    units = n % 10
    if tens > 10 and tens < 20:
        return suf[0] # teens with 'th'
    elif units <= 3:
        return suf[units]
    else:
        return suf[0] # 'th'

def day_suffix(t):
    '''
    Returns the suffix of the given struct_time day
    '''
    return num_suffix(t.tm_mday)

# Examples
print num_suffix(123)
print num_suffix(3431)
print num_suffix(1234)
print ''
print day_suffix(time.strptime("1 Dec 00", "%d %b %y"))
print day_suffix(time.strptime("2 Nov 01", "%d %b %y"))
print day_suffix(time.strptime("3 Oct 02", "%d %b %y"))
print day_suffix(time.strptime("4 Sep 03", "%d %b %y"))
print day_suffix(time.strptime("13 Nov 90", "%d %b %y"))
print day_suffix(time.strptime("14 Oct 10", "%d %b %y"))​​​​​​​
21
ответ дан Aram Kocharyan 19 August 2018 в 05:58
поделиться

Я собрал проект, который может преобразовать некоторые действительно аккуратные выражения. Проверьте timestring .

Вот несколько примеров ниже:

pip install timestring
>>> import timestring
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm')
<timestring.Date 2015-08-15 20:40:00 4491909392>
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm').date
datetime.datetime(2015, 8, 15, 20, 40)
>>> timestring.Range('next week')
<timestring.Range From 03/10/14 00:00:00 to 03/03/14 00:00:00 4496004880>
>>> (timestring.Range('next week').start.date, timestring.Range('next week').end.date)
(datetime.datetime(2014, 3, 10, 0, 0), datetime.datetime(2014, 3, 14, 0, 0))
460
ответ дан Bruno Bronosky 19 August 2018 в 05:58
поделиться
  • 1
    Из того, что я понимаю, этот ответ выводит только объекты времени, а не объекты datetime, поэтому ответ будет похоронен по сравнению с ответом Патрика. – Alexander Bird 7 September 2010 в 14:08
  • 2
    ответ ниже (Патрик Харрингтон) является более правильным, потому что time.strptime выводит только время, а не дату – Anatoly G 19 June 2011 в 20:56
  • 3
    Как сказал Александр, это возвращает struct_time, а не datetime. Конечно, вы можете преобразовать его в datetime, но ответ Патрика более прямолинейный, если вы хотите получить объект datetime в конце. – Leandro Alves 9 March 2013 в 17:20
  • 4
    Вау. Вау. Вау. Вау. Это так просто. У меня есть строка datetime, и я просто хочу вытащить год. Проще, как: import timestring timestring.Date('27 Mar 2014 12:32:29 GMT').year Этот lib сделал это ТАК ЛЕГКО! Спасибо. – brandonjp 11 April 2014 в 06:09
  • 5
    Ваше приветствие. Мне понравились бы ваши комментарии и идеи по улучшению этого пакета. Дайте мне знать, используйте вопросы github. Благодаря! – Steve Peak 14 April 2014 в 15:30
  • 6
    @BenBlank: «% b», «% p» может не работать в неанглийском языке. – jfs 29 April 2014 в 11:54
  • 7
    @ hobbes3 parse и format. – ᴠɪɴᴄᴇɴᴛ 22 October 2014 в 13:07
  • 8
    @Steve Peak timestring отлично работает! Нужно анализировать даты публикации с помощью scrapy, и это идеально их преобразует. – arctelix 22 October 2014 в 20:58
  • 9
    Привет, Стив, модуль замечательный. Было бы неплохо иметь атрибут строки дня недели. В противном случае вы не уверены, начинаете ли вы с понедельника или воскресенья – Anake 23 October 2014 в 11:00
  • 10
    @Anake вы можете создать проблему, чтобы запросить это добавление в github.com/stevepeak/timestring спасибо! – Steve Peak 25 October 2014 в 22:22

Использовать третью сторону dateutil library:

from dateutil import parser
dt = parser.parse("Aug 28 1999 12:00AM")

Он может обрабатывать большинство форматов даты, включая тот, который вам нужно проанализировать. Это удобнее, чем strptime, поскольку он может угадывать правильный формат большую часть времени.

Это очень полезно для написания тестов, где читаемость важнее производительности.

Вы можете установить его с:

pip install python-dateutil
626
ответ дан Decko 19 August 2018 в 05:58
поделиться
  • 1
    Имейте в виду, что для больших объемов данных это может быть не самый оптимальный способ решения проблемы. Угадывание формата каждый раз может быть очень медленным. – Paweł Polewicz 3 July 2011 в 01:08
  • 2
    Это хорошо, но было бы неплохо иметь встроенное решение, вместо того, чтобы идти к третьему лицу. – brian buck 12 October 2011 в 21:33
  • 3
    Когда я пытаюсь разобрать «32-й jan», он возвращает мне «2032-01-06» .. это неверно. есть ли способ проверить, является ли строка допустимой датой или нет – Kartik Domadiya 6 March 2013 в 08:11
  • 4
    @Reef: в 5 раз медленнее в соответствии с моим быстрым и грязным эталоном. Не so ужасно медленно, как я ожидал. – Antony Hatchkins 30 April 2013 в 19:19
  • 5
    Имеет свои собственные проблемы - например, молча отбрасывая информацию о часовом поясе от времени: попробуйте parser.parse ('15: 55EST ') и сравните с parser.parse ('15 .55CST') в качестве примера – F1Rumors 18 May 2015 в 15:42
In [34]: import datetime

In [35]: _now = datetime.datetime.now()

In [36]: _now
Out[36]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [37]: print _now
2016-01-19 09:47:00.432000

In [38]: _parsed = datetime.datetime.strptime(str(_now),"%Y-%m-%d %H:%M:%S.%f")

In [39]: _parsed
Out[39]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [40]: assert _now == _parsed
11
ответ дан guneysus 19 August 2018 в 05:58
поделиться

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

Python 3.2 +:

>>> datetime.datetime.strptime(
...     "March 5, 2014, 20:13:50", "%B %d, %Y, %H:%M:%S"
... ).replace(tzinfo=datetime.timezone(datetime.timedelta(hours=-3)))
30
ответ дан Janus Troelsen 19 August 2018 в 05:58
поделиться
  • 1
    Почему вы сохраняете уродливые, а иногда и неправильные (mktime() во время перехода DST) 1-й метод, если вы знаете второй метод (datetime.strptime())? Если вы хотите избежать исключения во время второго прыжка (второй метод выходит из строя), вы можете вместо этого использовать calendar.timegm: (datetime(1970,1,1)+timedelta(seconds=timegm(time.strptime(..)))).replace(tzinfo=timezone(timedelta(-3))) – jfs 14 September 2014 в 18:36

Он будет полезен для преобразования строки в datetime, а также с часовым поясом

def convert_string_to_time(date_string, timezone):
    from datetime import datetime
    import pytz
    date_time_obj = datetime.strptime(date_string[:26], '%Y-%m-%d %H:%M:%S.%f')
    date_time_obj_timezone = pytz.timezone(timezone).localize(date_time_obj)

     return date_time_obj_timezone

date = '2018-08-14 13:09:24.543953+00:00'
TIME_ZONE = 'UTC'
date_time_obj_timezone = convert_string_to_time(date, TIME_ZONE)
0
ответ дан Kanish Mathew 19 August 2018 в 05:58
поделиться

Если вы хотите только формат даты, вы можете вручную преобразовать его, передав свои отдельные поля, например:

>>> import datetime
>>> date = datetime.date(int('2017'),int('12'),int('21'))
>>> date
datetime.date(2017, 12, 21)
>>> type(date)
<type 'datetime.date'>

. Вы можете передать значения разделенных строк, чтобы преобразовать их в тип даты, например:

selected_month_rec = '2017-09-01'
date_formate = datetime.date(int(selected_month_rec.split('-')[0]),int(selected_month_rec.split('-')[1]),int(selected_month_rec.split('-')[2]))

Вы получите результирующее значение в формате даты.

8
ответ дан Peter Mortensen 19 August 2018 в 05:58
поделиться
  • 1
    format является зарезервированным словом в python и не должно использоваться как имя переменной. – shredding 10 January 2017 в 10:30

Вы можете использовать easy_date , чтобы сделать его легким:

import date_converter
converted_date = date_converter.string_to_datetime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
5
ответ дан Raphael Amoedo 19 August 2018 в 05:58
поделиться

Помните об этом, и вам не нужно было снова запутываться в преобразовании даты и времени.

String to datetime object = strptime

объект datetime для других форматов = strftime

Jun 1 2005 1:33PM

равно

%b %d %Y %I:%M%p

% b Месяц по сокращенному имени locale (июн)

% d День месяца как десятичное число с нулевым запасом (1)

% Y Год со столетием как десятичное число (2015)

% I Час (12-часовые часы) в виде десятичного числа с нулевым запасом (01)

% M Минута как десятичное число с нулевым запасом (33)

% p Значения локали либо AM или PM (PM)

, поэтому вам нужно strptime, т.е. преобразование string в

>>> dates = []
>>> dates.append('Jun 1 2005  1:33PM')
>>> dates.append('Aug 28 1999 12:00AM')
>>> from datetime import datetime
>>> for d in dates:
...     date = datetime.strptime(d, '%b %d %Y %I:%M%p')
...     print type(date)
...     print date
... 

Выход

<type 'datetime.datetime'>
2005-06-01 13:33:00
<type 'datetime.datetime'>
1999-08-28 00:00:00

Что если у вас есть другой формат дат, вы можете использовать panda или dateutil.parse

>>> import dateutil
>>> dates = []
>>> dates.append('12 1 2017')
>>> dates.append('1 1 2017')
>>> dates.append('1 12 2017')
>>> dates.append('June 1 2017 1:30:00AM')
>>> [parser.parse(x) for x in dates]

OutPut

[datetime.datetime(2017, 12, 1, 0, 0), datetime.datetime(2017, 1, 1, 0, 0), datetime.datetime(2017, 1, 12, 0, 0), datetime.datetime(2017, 6, 1, 1, 30)]
34
ответ дан Rizwan Mumtaz 19 August 2018 в 05:58
поделиться
  • 1
    % S для секунд как десятичное – optimist 9 June 2017 в 05:42
  • 2
    Не будет ли %b сломаться, если вы проанализируете английскую дату на машине, у которой нет английского языка? – bfontaine 8 May 2018 в 09:44

См. мой ответ .

В реальных данных это реальная проблема: множественные, несоответствующие, неполные, непоследовательные и многоязычные / регистровые форматы даты, часто смешанные свободно в один набор данных.

Нам нужно попробовать ... уловить несколько форматов datetime fmt1, fmt2, ..., fmtn и подавить / обработать исключения (из strptime()) для всех несоответствующих (и, в частности, избегать использования yukky n-deep с отступом лестницы try..catch). См. мое решение

0
ответ дан smci 19 August 2018 в 05:58
поделиться

Пример объекта datetime, посвященного Django Timezone.

import datetime
from django.utils.timezone import get_current_timezone
tz = get_current_timezone()

format = '%b %d %Y %I:%M%p'
date_object = datetime.datetime.strptime('Jun 1 2005  1:33PM', format)
date_obj = tz.localize(date_object)

Это преобразование очень важно для Django и Python, когда у вас есть USE_TZ = True:

RuntimeWarning: DateTimeField MyModel.created received a naive datetime (2016-03-04 00:00:00) while time zone support is active.
12
ответ дан Tarek Kalaji 19 August 2018 в 05:58
поделиться
462
ответ дан Bruno Bronosky 30 October 2018 в 18:07
поделиться
10
ответ дан Peter Mortensen 30 October 2018 в 18:07
поделиться
1
ответ дан Toskan 30 October 2018 в 18:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: