Python 将字符串转换为日期时间

Python 将字符串转换为日期时间,python,datetime,Python,Datetime,我有一个巨大的约会时间列表,如下所示: Jun 1 2005 1:33PM Aug 28 1999 12:00AM 我将把它们推回数据库中适当的datetime字段,所以我需要将它们变为实时datetime对象 这是通过Django的ORM进行的,因此我无法使用SQL在插入时进行转换。在模块中签出。这是相反的 datetime.strtime是将字符串解析为datetime的主要例程。它可以处理各种格式,格式由您提供的格式字符串决定: from datetime import datetim

我有一个巨大的约会时间列表,如下所示:

Jun 1 2005  1:33PM
Aug 28 1999 12:00AM
我将把它们推回数据库中适当的datetime字段,所以我需要将它们变为实时datetime对象

这是通过Django的ORM进行的,因此我无法使用SQL在插入时进行转换。

在模块中签出。这是相反的


datetime.strtime
是将字符串解析为datetime的主要例程。它可以处理各种格式,格式由您提供的格式字符串决定:

from datetime import datetime

datetime_object = datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
生成的
datetime
对象是时区原始对象

链接:

  • strtime
    的Python文档:

  • strtime
    /
    strftime
    格式字符串的Python文档:

  • 也是strftime的一个很好的参考

注:

  • strtime
    =“字符串分析时间”
  • strftime
    =“字符串格式时间”
  • 今天就大声说出来&6个月后你就不必再去寻找了
使用第三方库:

它可以处理大多数日期格式,包括需要解析的格式。它比strtime更方便,因为它大多数时候都能猜出正确的格式

它对于编写测试非常有用,因为可读性比性能更重要

您可以通过以下方式安装它:

pip install python-dateutil

这里没有提到的一些有用的东西:给一天添加后缀。我将后缀逻辑解耦,这样您就可以将其用于任何您喜欢的数字,而不仅仅是日期

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"))​​​​​​​
导入时间
def num_后缀(n):
'''
返回任何给定int的后缀
'''
suf=(‘th’、‘st’、‘nd’、‘rd’)
n=abs(n)#聪明人
tens=int(str(n)[-2:]
单位=n%10
如果tens>10且tens<20:
返回suf[0]#带“th”的青少年

elif units我已经完成了一个项目,可以转换一些非常简洁的表达式。查看

以下是一些例子:
pip安装时间串
>>> import timestring
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm')
<timestring.Date 2015-08-15 20:40:00 4491909392>
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm').date
datetime.datetime(2015, 8, 15, 20, 40)
>>> timestring.Range('next week')
<timestring.Range From 03/10/14 00:00:00 to 03/03/14 00:00:00 4496004880>
>>> (timestring.Range('next week').start.date, timestring.Range('next week').end.date)
(datetime.datetime(2014, 3, 10, 0, 0), datetime.datetime(2014, 3, 14, 0, 0))
导入时间字符串 >>>时间字符串日期(“2015年8月15日星期一晚上8:40”) >>>时间字符串日期(“2015年8月15日星期一晚上8:40”)。日期 datetime.datetime(2015,8,15,20,40) >>>timestring.Range(“下周”) >>>(timestring.Range('next week').start.date,timestring.Range('next week').end.date) (datetime.datetime(2014,3,10,0,0),datetime.datetime(2014,3,14,0,0))
许多时间戳都有一个隐含的时区。为了确保您的代码在每个时区都能工作,您应该在内部使用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)))

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对象的字符串=
strtime

datetime对象到其他格式=
strftime

2005年6月1日下午1:33

等于

%b%d%Y%I:%M%p

%b作为区域设置缩写名的月份(六月)

%d作为零填充十进制数的月份日期(1)

%以世纪为十进制数的Y年(2015年)

%I小时(12小时时钟)作为零填充十进制数(01)

%M分钟作为零填充十进制数(33)

%p语言环境相当于AM或PM(PM)

因此,您需要将strtime i-e转换为
string

>>> dates = []
>>> dates.append('Jun 1 2005  1:33PM')
>>> dates.append('Aug 28 1999 12:00AM')
>>> from datetime import datetime
>>> for d in dates:
...     date = datetime.strptime(d, '%b %d %Y %I:%M%p')
...     print type(date)
...     print date
... 
输出

<type 'datetime.datetime'>
2005-06-01 13:33:00
<type 'datetime.datetime'>
1999-08-28 00:00:00
输出

[datetime.datetime(2017, 12, 1, 0, 0), datetime.datetime(2017, 1, 1, 0, 0), datetime.datetime(2017, 1, 12, 0, 0), datetime.datetime(2017, 6, 1, 1, 30)]
您可以使用以使其变得简单:

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

下面是两个使用Pandas将格式为字符串的日期转换为datetime.date对象的解决方案

import pandas as pd

dates = ['2015-12-25', '2015-12-26']

# 1) Use a list comprehension.
>>> [d.date() for d in pd.to_datetime(dates)]
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]

# 2) Convert the dates to a DatetimeIndex and extract the python dates.
>>> pd.DatetimeIndex(dates).date.tolist()
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]
计时

dates = pd.DatetimeIndex(start='2000-1-1', end='2010-1-1', freq='d').date.tolist()

>>> %timeit [d.date() for d in pd.to_datetime(dates)]
# 100 loops, best of 3: 3.11 ms per loop

>>> %timeit pd.DatetimeIndex(dates).date.tolist()
# 100 loops, best of 3: 6.85 ms per loop
下面是如何转换OP的原始日期时间示例:

datetimes = ['Jun 1 2005  1:33PM', 'Aug 28 1999 12:00AM']

>>> pd.to_datetime(datetimes).to_pydatetime().tolist()
[datetime.datetime(2005, 6, 1, 13, 33), 
 datetime.datetime(1999, 8, 28, 0, 0)]
使用
到_datetime
将字符串转换为时间戳有很多选项,因此如果需要任何特殊的内容,请检查


同样,除了
之外,时间戳还有许多可以访问的功能。date

创建一个小型实用程序函数,如:

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
def date(datestr="", format="%Y-%m-%d"):
    from datetime import datetime
    if not datestr:
        return datetime.today().date()
    return datetime.strptime(datestr, format).date()
这是多功能的:

  • 如果您不传递任何参数,它将返回今天的日期
  • 有一个默认的日期格式,您可以覆盖它
  • 您可以轻松地修改它以返回日期时间

箭头提供了许多有用的日期和时间功能。这段代码提供了问题的答案,并表明arrow还能够轻松格式化日期并显示其他地区的信息

>>> 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'
有关详细信息,请参阅。

请参阅

在实际数据中,这是一个真正的问题:多个、不匹配、不完整、不一致和多语言/地区日期格式,通常在一个数据集中自由混合。生产代码失败是不行的,更不用说像狐狸一样异常快乐了

我们需要尝试捕获多个日期时间格式fmt1、fmt2、…、fmtn,并抑制/处理所有不匹配的异常(从
strtime()
)(特别是,避免需要一个yukky n深缩进的try..catch子句阶梯)。从


如果只需要日期格式,则可以通过传递各个字段(如:

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

您将获得日期格式的结果值。

我个人喜欢使用
解析器
模块的解决方案,这是这个问题的第二个答案,非常漂亮,因为您不必构造任何字符串文字来让它工作但是,一个缺点是它比使用
strptime
的公认答案慢了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

只要你不是一次又一次地这么做,我仍然认为
解析器
方法更方便,可以自动处理大多数时间格式。

它将有助于将字符串转换为日期时间和时间
>>> 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'
def try_strptime(s, fmts=['%d-%b-%y','%m/%d/%Y']):
    for fmt in fmts:
        try:
            return datetime.strptime(s, fmt)
        except:
            continue

    return None # or reraise the ValueError if no format matched, if you prefer
>>> 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]))
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
def convert_string_to_time(date_string, timezone):
    from datetime import datetime
    import pytz
    date_time_obj = datetime.strptime(date_string[:26], '%Y-%m-%d %H:%M:%S.%f')
    date_time_obj_timezone = pytz.timezone(timezone).localize(date_time_obj)

    return date_time_obj_timezone

date = '2018-08-14 13:09:24.543953+00:00'
TIME_ZONE = 'UTC'
date_time_obj_timezone = convert_string_to_time(date, TIME_ZONE)
emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv")
emp.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 8 columns):
First Name           933 non-null object
Gender               855 non-null object
Start Date           1000 non-null object

Last Login Time      1000 non-null object
Salary               1000 non-null int64
Bonus %              1000 non-null float64
Senior Management    933 non-null object
Team                 957 non-null object
dtypes: float64(1), int64(1), object(6)
memory usage: 62.6+ KB
emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv", parse_dates=["Start Date", "Last Login Time"])
emp.info()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 8 columns):
First Name           933 non-null object
Gender               855 non-null object
Start Date           1000 non-null datetime64[ns]
Last Login Time      1000 non-null datetime64[ns]
Salary               1000 non-null int64
Bonus %              1000 non-null float64
Senior Management    933 non-null object
Team                 957 non-null object
dtypes: datetime64[ns](2), float64(1), int64(1), object(4)
memory usage: 62.6+ KB
$ pip install dateparser
import datetime

aDate = datetime.date.fromisoformat('2020-10-04')
import datetime

aDateTime = datetime.datetime.fromisoformat('2020-10-04 22:47:00')
YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]
from datetime import date
date_from_yyyy_mm_dd = lambda δ : date(*[int(_) for _ in δ.split('-')])
date_object = date_from_yyyy_mm_dd('2021-02-15')