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


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.