Tarih dizesini ayrıştırın ve biçimi değiştirin


115

'15 Şubat 2010 Pazartesi' biçiminde bir tarih dizem var. Biçimi '15 / 02/2010 'olarak değiştirmek istiyorum. Bunu nasıl yapabilirim?


Yanıtlar:


153

datetime modül bu konuda size yardımcı olabilir:

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

Spesifik örnek için yapabileceğiniz

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

2
datetime.datetime (15 Şubat 2010 Pazartesi, "% a% b% d% Y"). strftime ("% d /% m /% Y") Doğru mu? ama bir hata aldım.
Nimmy

1
@nimmyliji: Yorumunuzu göndermeden 10 dakika önce düzeltildi. ve elbette date_stringbir dizi olarak sahip olmalısınız .
SilentGhost

3
tam olarak çalışan bir örnek lütfen;) hangi import / ... gereklidir?
kodlama

format1girdi tarih dizesinin biçimini ifade etmek için bir dize olması gerekir. format2çıktı alınacak hedef dize formatıdır.
ThorSummoner

1
Daha fazla ayrıntı verebilir misiniz, bu örnekte format1 nasıl görünmelidir?
user1767754

59

Dateutil kitaplığını kurabilirsiniz . Onun parseişlevi, bir dize sizinle yaptığım gibi biçimi belirtmek zorunda kalmadan içinde ne biçim anlamaya olabilir 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, yasal bir ISO dizesinin tam biçimi bilinmiyorsa daha iyi bir alternatiftir. ISO, mikrosaniyeler içerebilir veya içermeyebilir. Sonunda "Z" olabilir veya olmayabilir. datetime.strptime, buna uyacak kadar esnek değil.
Michael Kariv

4
Pase Date dikkatli kullanılmalıdır. parse ('12 .07.2017 ') datetime (2017, 12, 7, ..) döndürür ancak parse ('13 .07.2017') .datetime (2017, 7, 13, ...) döndürür
ego2dot0

Gelen python 3.xihtiyaçları yüklemeyepython-dateutil pip install python-dateutil
AB Abhi

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'


14

Bu soru sık sık geldiği için, işte basit bir açıklama.

datetimeveya timemodülün iki önemli işlevi vardır.

  • strftime - bir datetime veya time nesnesinden tarih veya saatin bir dize gösterimini oluşturur.
  • strptime - bir dizeden bir tarih saat veya zaman nesnesi oluşturur.

Her iki durumda da, bir biçimlendirme dizesine ihtiyacımız var. Dizenizde tarih veya saatin nasıl biçimlendirildiğini anlatan temsildir.

Şimdi bir tarih nesnemiz olduğunu varsayalım.

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

Bu tarihten itibaren formatta bir string oluşturmak istersek 'Mon Feb 15 2010'

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

Bunu stekrar bir datetimenesneye dönüştürmek istediğimizi varsayalım .

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

Bu belgeye bakın datetime ile ilgili tüm biçimlendirme yönergeleri.


Açıklamanı seviyorum.
ENCHANCE

2

Sadece tamamlama uğruna: strptime()tarih, gün, ay vb . Adını kullanarak ayrıştırırken , yerel ayarı hesaba katmanız gerektiğini unutmayın.

Dokümanlarda da dipnot olarak bahsedilmektedir .

Örnek olarak:

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 ve @ user1767754: Aşağıdaki iki satır çalışacaktır. Sorulan örnek problem için tam çözümü kimsenin göndermediğini görmedim. Umarım bu yeterli açıklamadır.

import datetime

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

Çıktı:

15/02/2010

1

Bunu pandaları kullanarak da başarabilirsiniz:

import pandas as pd

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

Çıktı:

'15/02/2010'

Pandas yaklaşımını aşağıdaki gibi farklı veri türleri için uygulayabilirsiniz:

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)

Çıktı:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.