Проаналізуйте рядок дати та змініть формат


115

У мене є рядок дати у форматі "Пн 15 лютого 2010 року". Я хочу змінити формат на '15 / 02/2010 '. Як я можу це зробити?


Дублікат всього цього: stackoverflow.com/search?q=%5Bpython%5D+parse+date . Точний дублікат Thise: stackoverflow.com/questions/1713594 / ...
С. Лотт

Відповіді:


153

datetime Модуль може допомогти вам у цьому:

datetime.datetime.strptime(date_string, format1).strftime(format2)

Для конкретного прикладу ви могли б зробити

>>> datetime.datetime.strptime('Mon Feb 15 2010', '%a %b %d %Y').strftime('%d/%m/%Y')
'15/02/2010'
>>>

2
datetime.datetime (пн. 15 лютого 2010 р., "% a% b% d% Y"). але я отримав помилку
Німмі

1
@nimmyliji: це було зафіксовано за 10 хвилин до того, як ви опублікували свій коментар. і, звичайно, ви повинні мати date_stringяк струну.
SilentGhost

3
повний робочий приклад, будь ласка;) який імпорт / ... потрібно?
кодування

format1повинен бути рядок для вираження формату рядка вхідної дати. format2- формат цільового рядка для виведення.
ThorSummoner

1
Чи можете ви детальніше розглянути, як повинен виглядати format1 у цьому прикладі?
користувач1767754

59

Ви можете встановити бібліотеку датутилів . Його parseфункція може визначити, у якому форматі знаходиться рядок, не вказуючи формат, як у вас datetime.strptime.

from dateutil.parser import parse
dt = parse('Mon Feb 15 2010')
print(dt)
# datetime.datetime(2010, 2, 15, 0, 0)
print(dt.strftime('%d/%m/%Y'))
# 15/02/2010

dateutil.parse є кращою альтернативою, якщо точний формат легального рядка ISO невідомий. ISO може містити або не містити мікросекунд. Він може містити або не містити "Z". datetime.strptime недостатньо гнучкий, щоб пристосувати для цього.
Михайло Карів

4
Дата пазування повинна використовуватися обережно. parse ('12 .07.2017 ') повертає datetime (2017, 12, 7, ..), але parse ('13 .07.2017') повертається .datetime (2017, 7, 13, ...)
ego2dot0

В python 3.xпотреби встановитиpython-dateutil pip install python-dateutil
AB абхі

24
>>> from_date="Mon Feb 15 2010"
>>> import time                
>>> conv=time.strptime(from_date,"%a %b %d %Y")
>>> time.strftime("%d/%m/%Y",conv)
'15/02/2010'

23

перетворити рядок в об'єкт datetime

from datetime import datetime
s = "2016-03-26T09:25:55.000Z"
f = "%Y-%m-%dT%H:%M:%S.%fZ"
out = datetime.strptime(s, f)
print(out)
output:
2016-03-26 09:25:55

Це не відповідно до формату, який він запитував, який мав у ньому рядок місяця "Feb".
Шахір Ансарі

@ShahirAnsari ви можете змінити формат, як вам подобається, зверніться до " docs.python.org/3/library/datetime.html "
anjaneyulubatta505

14

Оскільки це питання виникає часто, ось просте пояснення.

datetimeабо timeмодуль має дві важливі функції.

  • strлові - створює рядкове подання дати або часу з об'єкта дати або часу.
  • strptime - створює об'єкт дати чи часу з рядка.

В обох випадках нам потрібна форматувальна рядок. Саме подання говорить про те, як дата або час форматується у вашому рядку.

Тепер припустимо, що у нас є об’єкт дати.

>>> from datetime import datetime
>>> d = datetime(2010, 2, 15)
>>> d
datetime.datetime(2010, 2, 15, 0, 0)

Якщо ми хочемо створити рядок з цієї дати у форматі 'Mon Feb 15 2010'

>>> s = d.strftime('%a %b %d %y')
>>> print s
Mon Feb 15 10

Припустимо, ми хочемо знову перетворити це sна datetimeоб'єкт.

>>> new_date = datetime.strptime(s, '%a %b %d %y')
>>> print new_date
2010-02-15 00:00:00

Перегляньте цей документ усі директиви щодо форматування щодо дати.


Я люблю ваше пояснення.
enchance

2

Тільки задля завершення: коли розбираєте дату, використовуючи strptime()дату, містить назву дня, місяця тощо, майте на увазі, що вам доведеться обліковувати локаль.

Він також згадується як виноска в документах .

Як приклад:

import locale
print(locale.getlocale())

>> ('nl_BE', 'ISO8859-1')

from datetime import datetime
datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')

>> ValueError: time data '6-Mar-2016' does not match format '%d-%b-%Y'

locale.setlocale(locale.LC_ALL, 'en_US')
datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')

>> '2016-03-06'

2

@codeling та @ user1767754: Наступні два рядки працюватимуть. Я не бачив, щоб ніхто не розмістив повне рішення для прикладу проблеми, яку задали. Сподіваємось, цього достатньо пояснень.

import datetime

x = datetime.datetime.strptime("Mon Feb 15 2010", "%a %b %d %Y").strftime("%d/%m/%Y")
print(x)

Вихід:

15/02/2010

1

Ви можете досягти цього, використовуючи також панди:

import pandas as pd

pd.to_datetime('Mon Feb 15 2010', format='%a %b %d %Y').strftime('%d/%m/%Y')

Вихід:

'15/02/2010'

Ви можете застосувати підхід панди для різних типів даних як:

import pandas as pd
import numpy as np

def reformat_date(date_string, old_format, new_format):
    return pd.to_datetime(date_string, format=old_format, errors='ignore').strftime(new_format)

date_string = 'Mon Feb 15 2010'
date_list = ['Mon Feb 15 2010', 'Wed Feb 17 2010']
date_array = np.array(date_list)
date_series = pd.Series(date_list)

old_format = '%a %b %d %Y'
new_format = '%d/%m/%Y'

print(reformat_date(date_string, old_format, new_format))
print(reformat_date(date_list, old_format, new_format).values)
print(reformat_date(date_array, old_format, new_format).values)
print(date_series.apply(lambda x: reformat_date(x, old_format, new_format)).values)

Вихід:

15/02/2010
['15/02/2010' '17/02/2010']
['15/02/2010' '17/02/2010']
['15/02/2010' '17/02/2010']

0

використовувати бібліотеку datatime http://docs.python.org/library/datetime.html шукати 9.1.7. especiall strptime () strearch () поведінка¶ приклади http://pleac.sourceforge.net/pleac_python/datesandtimes.html


для помилки вище nimmyliji ви повинні були виконати datetime.datetime.strptime ("пн. 15 лютого 2010 р.,"% a% b% d% Y "). строковий період ("% d /% m /% Y "), який він дає" 15.02.2010 '
Роман А. Тейчер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.