Розбір ненульових відбитків міток часу в Python


83

Я хочу отримати дати з таких міток часу, як наступні: 3/1/2014 9:55з datetime.strptime, або щось еквівалентне.

Місяць, день місяця, годину не дорівнює нулю прокладений, але не схоже, щоб бути форматуванням директиви перераховані тут , який здатний аналізувати це автоматично.

Який найкращий підхід для цього? Дякую!

Відповіді:


130

strptimeможе аналізувати незаповнені значення. Той факт, що вони зазначені як заповнені в таблиці кодів форматування, стосується strftimeвихідних даних. Тож ви можете просто використовувати

datetime.strptime(datestr, "%m/%d/%Y %H:%M")

8

strptimeне вимагає значень, заповнених 0. Див. Приклад нижче

datetime.strptime("3/1/2014 9:55", "%m/%d/%Y %H:%M")
output:   datetime.datetime(2014, 3, 1, 9, 55)

2

Про всяк випадок, якщо ця відповідь допоможе комусь іншому - я прийшов сюди, думаючи, що маю проблему з нульовим заповненням, але насправді це стосувалося 12:00 проти 00:00 та %Iформатора.

%IФорматіровщік призначається , щоб відповідати 12-годинний тактовим годинах, при необхідності нулів. Але залежно від вашого джерела даних, ви можете отримати дані, які говорять, що опівночі або опівдні насправді дорівнює нулю, наприклад:

>>> datetime.strptime('2015/01/01 0:12am', "%Y/%m/%d %I:%M%p")
ValueError: time data '2015/01/01 0:12am' does not match format '%Y/%m/%d %I:%M'

Що strptime насправді хотіли було 12, а не нуль:

>>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p")
datetime.datetime(2015, 1, 1, 0, 12)

Але ми не завжди контролюємо наші джерела даних! Моїм рішенням для цього крайового випадку було вловити виняток, спробувати розібрати його за %Hдопомогою швидкої перевірки того, чи ми знаходимось у крайньому випадку, в якому ми думаємо, що знаходимося.

def get_datetime(string):
    try:
        timestamp = datetime.strptime(string, "%m/%d/%Y %I:%M%p")
    except ValueError:
        # someone used zero for midnight?
        timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p")
        assert string.lower().endswith('am')
        assert timestamp.hour == 0
    return timestamp

0:12amнедійсне введення. Це повинно бути 12:12am. 11:59 pmслідує 12:00 am, а не 0:00am. Можуть існувати різні способи подання даних у неправильному часовому форматі, наприклад, для введення може використовуватися двозначний рік ( %y) замість чотиризначного рік ( %Y) або день / місяць можуть бути помінені місцями ( %m/%dпроти %d/%m) тощо. День / місяць може бути неоднозначним, наприклад, 2015/10/12це "12 жовтня" чи "10 грудня"? До речі, ви повинні використовувати %Y/%m/%dзамість того, %m/%d/%Yщоб відповідати формату введення.
jfs

Дякую, я усвідомлюю, що це невірне введення, як я кажу, воно надходить із джерела даних, яке я не контролюю.
hwjp

1

Спосіб без шаблону - це dateutil.parseмодуль використання , він дозволяє проаналізувати загальні формати дат, навіть якщо ви не знаєте, що він використовує в даний час
Ex:

>>> import dateutil.parser
>>> 
>>> utc_time     = '2014-08-13T00:00:00'
>>> verbose_time = '13-Aug-2014'
>>> some_locale  = '3/1/2014 9:55'
>>> dateutil.parser.parse(utc_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(verbose_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(some_locale)
datetime.datetime(2014, 3, 1, 9, 55)

1

Документ strftime ви можете побачити тут in, але насправді вони не всі працюють добре на всіх платформах , наприклад, %-d,%-m, не працюють на win7 by python 2.7 ,, щоб ви могли виконати так

>>> date_str = '{d.year}-{d.month}-{d.day}'.format(d=datetime.datetime.now())  
>>> print(date_str)
2016-5-23

1
У рідній Windows хеш замінено на тире: %#d, %#m. Але як тире, так і хеш-моди потрібні лише у форматуванні рядків ( strftime), а не в синтаксичному аналізі ( strptime).
Нуно Андре
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.