python時間轉數字 - strptime python3




將字符串轉換為日期時間 (12)

簡短而簡單。 我有一個像這樣的日期時間的巨大列表作為字符串:

Jun 1 2005  1:33PM
Aug 28 1999 12:00AM

我將把它們推回到數據庫中適當的日期時間字段,所以我需要將它們變成真正的日期時間對象。

任何幫助(即使這只是一個正確的方向踢),將不勝感激。

編輯:這是通過Django的ORM,所以我不能使用SQL做插入轉換。


Django支持時區感知的datetime對象示例。

import datetime
from django.utils.timezone import get_current_timezone
tz = get_current_timezone()

format = '%b %d %Y %I:%M%p'
date_object = datetime.datetime.strptime('Jun 1 2005  1:33PM', format)
date_obj = tz.localize(date_object)

當您有USE_TZ = True時,此轉換對於Django和Python非常重要:

RuntimeWarning: DateTimeField MyModel.created received a naive datetime (2016-03-04 00:00:00) while time zone support is active.

datetime python模塊適用於獲取日期時間和轉換日期時間格式。

import datetime

new_date_format1 = datetime.datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
new_date_format2 = datetime.datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p').strftime('%Y/%m/%d %I:%M%p')
print new_date_format1
print new_date_format2

輸出:

2005-06-01 13:33:00
2005/06/01 01:33PM

你可以使用easy_dateeasy_date它:

import date_converter
converted_date = date_converter.string_to_datetime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

使用第三方dateutil庫:

from dateutil import parser
dt = parser.parse("Aug 28 1999 12:00AM")

它可以處理大多數日期格式,包括您需要解析的格式。 它比strptime更方便,因為它大部分時間都可以猜出正確的格式。

它對編寫測試非常有用,其中可讀性比性能更重要。

您可以通過以下方式安裝它

pip install python-dateutil

如果你只想要日期格式,那麼你可以手動轉換它,我傳遞你的個人領域,如:

>>> import datetime
>>> date = datetime.date(int('2017'),int('12'),int('21'))
>>> date
datetime.date(2017, 12, 21)
>>> type(date)
<type 'datetime.date'>

你可以傳遞你的分割字符串值來將它轉換為日期類型,如:

selected_month_rec = '2017-09-01'
date_formate = datetime.date(int(selected_month_rec.split('-')[0]),int(selected_month_rec.split('-')[1]),int(selected_month_rec.split('-')[2]))

你會得到日期合同的resultent值。


我個人喜歡使用parser模塊的解決方案,這是對這個問題的第二個答案,並且非常漂亮,因為您不必構造任何字符串文字即可使其工作。 然而,其中一個缺點是,它比用公認的答案慢了90%

from dateutil import parser
from datetime import datetime
import timeit

def dt():
    dt = parser.parse("Jun 1 2005  1:33PM")
def strptime():
    datetime_object = datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

print(timeit.timeit(stmt=dt, number=10**5))
print(timeit.timeit(stmt=strptime, number=10**5))
>10.70296801342902
>1.3627995655316933

只要你一次又一次地做了這麼多次,我仍然認為parser方法更加方便,並且會自動處理大部分時間格式。


檢查time模塊中的strptime 。 這是strftime的逆過程。

$ python
>>> import time
>>> time.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
time.struct_time(tm_year=2005, tm_mon=6, tm_mday=1,
                 tm_hour=13, tm_min=33, tm_sec=0,
                 tm_wday=2, tm_yday=152, tm_isdst=-1)

看到我的答案

在實際數據中,這是一個真正的問題:多個,不匹配,不完整,不一致和多語言/地區日期格式,通常在一個數據集中自由混合。 生產代碼失敗並不合適,更不用說像狐狸一樣開始異常開心。

我們需要嘗試...捕獲多個日期時間格式fmt1,fmt2,...,fmtn,並為所有那些不匹配的情況抑制/處理異常(來自strptime() )(特別是避免需要一個yukky n深度縮進try..catch子句的階梯)。 看我的解決方案


許多時間戳具有隱含的時區。 為確保您的代碼在每個時區都能正常工作,您應該在內部使用UTC並在每次外來對象進入系統時附加一個時區。

Python 3.2+:

>>> datetime.datetime.strptime(
...     "March 5, 2014, 20:13:50", "%B %d, %Y, %H:%M:%S"
... ).replace(tzinfo=datetime.timezone(datetime.timedelta(hours=-3)))

這個問題已經被多次訪問過,但沒有提到箭頭 ,它提供了許多有用的日期和時間函數。 這部分代碼為問題提供了答案,並顯示箭頭也能夠輕鬆地格式化日期並顯示其他語言環境的信息。

>>> import arrow
>>> dateStrings = [ 'Jun 1  2005 1:33PM', 'Aug 28 1999 12:00AM' ]
>>> for dateString in dateStrings:
...     dateString
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').datetime
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').format('ddd, Do MMM YYYY HH:mm')
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').humanize(locale='de')
...     
'Jun 1  2005 1:33PM'
datetime.datetime(2005, 6, 1, 13, 33, tzinfo=tzutc())
'Wed, 1st Jun 2005 13:33'
'vor 11 Jahren'
'Aug 28 1999 12:00AM'
datetime.datetime(1999, 8, 28, 0, 0, tzinfo=tzutc())
'Sat, 28th Aug 1999 00:00'
'vor 17 Jahren'

有關更多信息,請參見http://arrow.readthedocs.io/en/latest/


這裡沒有提到的東西很有用:在當天添加後綴。 我將後綴邏輯分開,以便您可以將它用於任何您喜歡的數字,而不僅僅是日期。

import time

def num_suffix(n):
    '''
    Returns the suffix for any given int
    '''
    suf = ('th','st', 'nd', 'rd')
    n = abs(n) # wise guy
    tens = int(str(n)[-2:])
    units = n % 10
    if tens > 10 and tens < 20:
        return suf[0] # teens with 'th'
    elif units <= 3:
        return suf[units]
    else:
        return suf[0] # 'th'

def day_suffix(t):
    '''
    Returns the suffix of the given struct_time day
    '''
    return num_suffix(t.tm_mday)

# Examples
print num_suffix(123)
print num_suffix(3431)
print num_suffix(1234)
print ''
print day_suffix(time.strptime("1 Dec 00", "%d %b %y"))
print day_suffix(time.strptime("2 Nov 01", "%d %b %y"))
print day_suffix(time.strptime("3 Oct 02", "%d %b %y"))
print day_suffix(time.strptime("4 Sep 03", "%d %b %y"))
print day_suffix(time.strptime("13 Nov 90", "%d %b %y"))
print day_suffix(time.strptime("14 Oct 10", "%d %b %y"))​​​​​​​

In [34]: import datetime

In [35]: _now = datetime.datetime.now()

In [36]: _now
Out[36]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [37]: print _now
2016-01-19 09:47:00.432000

In [38]: _parsed = datetime.datetime.strptime(str(_now),"%Y-%m-%d %H:%M:%S.%f")

In [39]: _parsed
Out[39]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [40]: assert _now == _parsed




datetime