Parse string tanggal dan ubah format

115

Saya memiliki string tanggal dengan format 'Mon Feb 15 2010'. Saya ingin mengubah format menjadi '15 / 02/2010 '. Bagaimana saya bisa melakukan ini?

Nimmy
sumber
Gandakan dari semua ini: stackoverflow.com/search?q=%5Bpython%5D+parse+date . Duplikat persis dari thise: stackoverflow.com/questions/1713594/…
S. Lott

Jawaban:

153

datetime modul dapat membantu Anda dengan itu:

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

Untuk contoh spesifik yang bisa Anda lakukan

>>> datetime.datetime.strptime('Mon Feb 15 2010', '%a %b %d %Y').strftime('%d/%m/%Y')
'15/02/2010'
>>>
SilentGhost
sumber
2
datetime.datetime (Sen 15 Feb 2010, "% a% b% d% Y"). strftime ("% d /% m /% Y") Apakah benar? tetapi saya mendapat kesalahan.
Nimmy
1
@nimmyliji: sudah diperbaiki 10 menit sebelum Anda memposting komentar Anda. dan tentu saja Anda harus memiliki date_stringsebagai string.
SilentGhost
3
tolong contoh yang berfungsi sepenuhnya;) impor / ... apa yang diperlukan?
codeling
format1harus berupa string untuk mengekspresikan format string tanggal masukan. format2adalah format string target untuk dikeluarkan.
ThorSummoner
1
Bisakah Anda menjelaskan lebih lanjut, bagaimana seharusnya format1 terlihat dalam contoh ini?
pengguna1767754
59

Anda dapat menginstal perpustakaan dateutil . Fungsinya parsedapat mengetahui format string tanpa harus menentukan format seperti yang Anda lakukan 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
llazzaro.dll
sumber
dateutil.parse adalah alternatif yang lebih baik jika format pasti dari string ISO legal tidak diketahui. ISO mungkin mengandung atau tidak mengandung mikrodetik. Ini mungkin atau mungkin tidak mengandung tanda "Z". datetime.strptime tidak cukup fleksibel untuk mengakomodasi itu.
Michael Kariv
4
Tanggal Pase harus digunakan dengan hati-hati. parse ('12 .07.2017 ') mengembalikan datetime (2017, 12, 7, ..) tetapi parse ('13 .07.2017') mengembalikan .datetime (2017, 7, 13, ...)
ego2dot0
Dalam python 3.xkebutuhan untuk menginstalpython-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'
anjing hantu74
sumber
23

mengonversi string menjadi objek 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
anjaneyulubatta505
sumber
Ini tidak sesuai dengan format yang dia tanyakan, yang memiliki string bulan "Feb" di dalamnya.
Shahir Ansari
@ShahirAnsari Anda dapat mengubah format sesuka Anda merujuk " docs.python.org/3/library/datetime.html "
anjaneyulubatta505
14

Karena pertanyaan ini sering muncul, berikut penjelasan sederhananya.

datetimeatau timemodul memiliki dua fungsi penting.

  • strftime - membuat representasi string dari tanggal atau waktu dari objek datetime atau waktu.
  • strptime - membuat objek datetime atau waktu dari string.

Dalam kedua kasus tersebut, kita membutuhkan string pemformatan. Ini adalah representasi yang memberi tahu bagaimana tanggal atau waktu diformat dalam string Anda.

Sekarang mari kita asumsikan kita memiliki objek tanggal.

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

Jika kita ingin membuat string dari tanggal ini dalam format 'Mon Feb 15 2010'

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

Mari kita asumsikan kita ingin mengubahnya slagi menjadi datetimeobjek.

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

Lihat Dokumen ini semua petunjuk pemformatan mengenai tanggal waktu.

thavan
sumber
Saya suka penjelasan Anda.
enchance
2

Hanya untuk penyelesaian: saat mengurai tanggal menggunakan strptime()dan tanggal berisi nama hari, bulan, dll, perhatikan bahwa Anda harus memperhitungkan lokal.

Ini juga disebutkan sebagai catatan kaki di dokumen .

Sebagai contoh:

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'
ƘɌỈSƬƠƑ
sumber
2

@codeling dan @ user1767754: Dua baris berikut akan bekerja. Saya melihat tidak ada yang memposting solusi lengkap untuk contoh masalah yang ditanyakan. Semoga penjelasan ini cukup.

import datetime

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

Keluaran:

15/02/2010
Gobryas
sumber
1

Anda juga dapat melakukannya dengan menggunakan panda:

import pandas as pd

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

Keluaran:

'15/02/2010'

Anda dapat menerapkan pendekatan pandas untuk tipe data yang berbeda sebagai:

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)

Keluaran:

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