将string转换为date时间

简单而简单。 我有一个像这样的string的date时间的巨大列表:

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

我将把它们推回到数据库中正确的date时间字段,所以我需要把它们变成真正的date时间对象。

任何帮助(即使这只是一个正确的方向踢),将不胜感激。

编辑:这是通过Django的ORM,所以我不能使用SQL做插入转换。

 from datetime import datetime datetime_object = datetime.strptime('Jun 1 2005 1:33PM', '%b %d %Y %I:%M%p') 

由此产生的datetime对象是时区天真的。

链接:

  • strptime Python文档: Python 2 , Python 3

  • Python文档strftime格式掩码: Python 2 , Python 3

  • 这对于s​​trftime也是一个非常好的参考

笔记:

  • strptime =“stringparsing时间”
  • strftime =“string格式化时间”
  • 今天大声地发出声音,6个月后你就不用再search了。

使用第三方dateutil库:

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

它可以处理大多数的date格式,包括你需要parsing的格式。 大多数情况下,它可以猜出正确的格式,比strptime更方便。

这对编写testing非常有用,其中可读性比性能更重要。

你可以用下面的方法安装它

 pip install python-dateutil 

检查时间模块中的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) 

我已经整理了一个可以转换一些非常整洁的expression的项目。 检查时间string

以下是一些例子:

pip install timestring

 >>> 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)) 

许多时间戳都有一个隐含的时区。 为确保您的代码在每个时区都能正常工作,您应该在内部使用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))) 

记住这一点,你不需要再次在date时间转换混淆。

string到datetime object = strptime

datetime对象为其他格式= strftime

Jun 1 2005 1:33PM

等于

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

%b月份作为语言环境的缩写名称(Jun)

%d当月的一天作为零填充十进制数(1)

%Y以十进制数表示的世纪(2015)

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

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

%p Locale相当于AM或PM(PM)

所以你需要strptime即转换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 

如果您有不同的date格式,可以使用panda或dateutil.parse

 >>> import dateutil >>> dates = [] >>> dates.append('12 1 2017') >>> dates.append('1 1 2017') >>> dates.append('1 12 2017') >>> dates.append('June 1 2017 1:30:00AM') >>> [parser.parse(x) for x in dates] 

产量

 [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)] 

这里没有提到的东西是有用的:在当天添加一个后缀。 我将后缀逻辑解耦,以便您可以将它用于任何您喜欢的数字,而不仅仅是date。

 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"))​​​​​​​ 

这是一个解决scheme,使用pandas将格式化为string的date转换为datetime.date对象。

 import pandas as pd dates = ['2015-12-25', '2015-12-26'] >>> [d.date() for d in pd.to_datetime(dates)] [datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)] 

这里是如何转换OP的原始date时间的例子:

 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)] 

使用to_datetime将string转换为Pandas Timestam的选项很多,所以如果需要特殊的东西,请检查文档 。

同样,除了.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 

Django时区感知date时间对象的例子。

 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. 

创build一个小的效用函数,如:

 def date(datestr="", format="%Y-%m-%d"): from datetime import datetime if not datestr: return datetime.today().date() return datetime.strptime(datestr, format).date() 

这足够多才多艺:

  • 如果你不通过任何争论,它将返回今天的date。
  • date格式为默认值,您可以覆盖。
  • 您可以轻松修改它以返回date时间。

date时间python模块是很好的获取date时间和转换date时间格式。

 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 

这个问题已经被多次访问过,但没有提到箭头 ,它提供了许多有用的date和时间的function。 这段代码提供了一个问题的答案,并显示箭头也能够轻松地格式化date和显示其他地区的信息。

 >>> 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/

您可以使用easy_date简化操作 :

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