문자열과 같은 날짜 시간 목록이 많이 있습니다.
Jun 1 2005 1:33PM
Aug 28 1999 12:00AM
데이터베이스에서 적절한 날짜 / 시간 필드로 다시 밀어 넣을 것이므로 실제 날짜 / 시간 개체로 마술로 바꿔야합니다.
이것은 Django의 ORM을 거치므로 SQL을 사용하여 삽입시 변환을 수행 할 수 없습니다.
문자열과 같은 날짜 시간 목록이 많이 있습니다.
Jun 1 2005 1:33PM
Aug 28 1999 12:00AM
데이터베이스에서 적절한 날짜 / 시간 필드로 다시 밀어 넣을 것이므로 실제 날짜 / 시간 개체로 마술로 바꿔야합니다.
이것은 Django의 ORM을 거치므로 SQL을 사용하여 삽입시 변환을 수행 할 수 없습니다.
답변:
datetime.strptime
문자열을 날짜 / 시간으로 구문 분석하는 기본 루틴입니다. 주어진 형식 문자열에 의해 결정된 형식으로 모든 종류의 형식을 처리 할 수 있습니다.
from datetime import datetime
datetime_object = datetime.strptime('Jun 1 2005 1:33PM', '%b %d %Y %I:%M%p')
결과 datetime
개체는 표준 시간대가 아닙니다.
연결:
문자열 strptime
/ strftime
형식 문자열에 대한 Python 설명서 : Python 2 , Python 3
strftime.org 는 또한 strftime 에 대한 훌륭한 참고 자료입니다
노트:
strptime
= "문자열 구문 분석 시간"strftime
= "문자열 형식 시간"date
대신의를 datetime
통해가는, datetime
잘 핸들을 : datetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1)
datetime
Python 3에서이 행을 추가 하여 시간대 인식 객체를 얻을 수 있습니다 .from datetime import timezone; datetime_object = datetime_object.replace(tzinfo=timezone.utc)
"%Y-%m-%d %H:%M:%S"
from datetime import datetime
대신에 비슷한 문제를 해결했습니다 import datetime
.
타사 dateutil 라이브러리를 사용하십시오 .
from dateutil import parser
parser.parse("Aug 28 1999 12:00AM") # datetime.datetime(1999, 8, 28, 0, 0)
구문 분석해야하는 형식을 포함하여 대부분의 날짜 형식을 처리 할 수 있습니다. strptime
대부분 올바른 형식을 추측 할 수있는 것보다 편리 합니다.
가독성이 성능보다 중요한 테스트 작성에 매우 유용합니다.
다음과 같이 설치할 수 있습니다.
pip install python-dateutil
시간 모듈 에서 strptime 을 확인하십시오 . strftime 의 반대입니다 .
$ python
>>> import time
>>> my_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)
timestamp = time.mktime(my_time)
# convert time object to datetime
from datetime import datetime
my_datetime = datetime.fromtimestamp(timestamp)
# convert time object to date
from datetime import date
my_date = date.fromtimestamp(timestamp)
정말 깔끔한 표현을 변환 할 수있는 프로젝트를 만들었습니다. timestring을 확인하십시오 .
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))
import timestring
timestring.Date('27 Mar 2014 12:32:29 GMT').year
이 lib는 그렇게 쉽게 만들었습니다! 감사합니다.
2017-02-01
. 2017 년 5 월 2 일에도 동일합니다 (그러나 2017 년 2 월 5 일을 올바르게 수행합니다). 마지막 두 가지 중 어느 것도 내 지식에 익숙한 형식은 아니지만 어쨌든 지적 할 것이라고 생각했습니다.
Date("20180912")
어떻게 든 값이 구문 분석 2018-11-21
됩니다. 자신의 책임하에 사용하십시오.
이것을 기억하면 날짜 시간 변환에 다시 혼동하지 않아도됩니다.
문자열을 날짜 / 시간 객체 = strptime
다른 형식으로 날짜 / 시간 객체 = strftime
Jun 1 2005 1:33PM
~와 같다
%b %d %Y %I:%M%p
% b 로케일의 약식 이름으로 월 (6 월)
% d 달로 채워진 10 진수 (1)
% Y 십진수로 세기를 가진 해 (2015)
0으로 채워진 10 진수로 표시되는 % I 시간 (12 시간 시계) (01)
0으로 채워진 10 진수로 표시되는 % M 분 (33)
% p 로케일의 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
날짜 형식이 다른 경우 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)]
%b
영어 로캘이없는 컴퓨터에서 영어 날짜를 구문 분석해도 중단되지 않습니까?
많은 타임 스탬프에는 시간대가 포함되어 있습니다. 코드가 모든 시간대에서 작동하도록하려면 내부적으로 UTC를 사용하고 이물질이 시스템에 들어갈 때마다 시간대를 연결해야합니다.
파이썬 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)))
mktime()
두 번째 방법 ( datetime.strptime()
) 을 알고 있다면 왜 추악하고 때로는 잘못 ( DST 전환 중) 첫 번째 방법을 유지 합니까? 윤초 동안 예외를 피하려면 (두 번째 방법이 실패 함) calendar.timegm
대신 다음을 사용할 수 있습니다 .(datetime(1970,1,1)+timedelta(seconds=timegm(time.strptime(..)))).replace(tzinfo=timezone(timedelta(-3)))
다음은 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)]
을 사용하여 문자열에서 Pandas Timestamp로 변환하는 많은 옵션이 to_datetime
있으므로 특별한 것이 필요한 경우 문서를 확인하십시오 .
마찬가지로 타임 스탬프에는 액세스 할 수있는 많은 속성과 메서드 가 있습니다.date
나는 개인적 parser
으로이 질문에 대한 두 번째 답변 인 모듈을 사용하는 솔루션을 좋아합니다 . 작동하기 위해 문자열 리터럴을 구성 할 필요가 없으므로 아름답습니다. 그러나 한 가지 단점은 허용 된 답변보다 90 % 느리다는 것입니다 strptime
.
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
방법이 더 편리하고 대부분의 시간 형식을 자동으로 처리 한다고 생각합니다 .
여기에 언급되어 있지 않은 유용한 정보 : 하루에 접미사 추가. 접미사 논리를 분리하여 날짜뿐만 아니라 원하는 숫자로 사용할 수 있습니다.
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
Django 시간대 인식 날짜 시간 객체 예.
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)
이 변환은 다음과 같은 경우 Django와 Python에 매우 중요합니다 USE_TZ = True
.
RuntimeWarning: DateTimeField MyModel.created received a naive datetime (2016-03-04 00:00:00) while time zone support is active.
다음과 같은 작은 유틸리티 함수를 작성하십시오.
def date(datestr="", format="%Y-%m-%d"):
from datetime import datetime
if not datestr:
return datetime.today().date()
return datetime.strptime(datestr, format).date()
이것은 충분히 다재다능합니다.
format
파이썬에서 예약어이며 변수 이름으로 사용해서는 안됩니다.
문자열을 날짜 시간으로 변환하거나 시간대와 함께 사용하면 도움이됩니다.
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)
화살표 는 날짜와 시간에 유용한 기능을 많이 제공합니다. 이 코드는 질문에 대한 답변을 제공하며 화살표가 날짜를 쉽게 형식화하고 다른 로케일에 대한 정보를 표시 할 수 있음을 보여줍니다.
>>> 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')
날짜 형식 만 원하는 경우 다음과 같은 개별 필드를 전달하여 수동으로 변환 할 수 있습니다.
>>> 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]))
날짜 형식으로 결과 값을 얻습니다.
당신은 또한 확인할 수 있습니다 dateparser
dateparser
웹 페이지에서 일반적으로 사용되는 거의 모든 문자열 형식으로 현지화 된 날짜를 쉽게 구문 분석 할 수있는 모듈을 제공합니다.
설치:
$ pip install dateparser
이것은 날짜를 구문 분석 할 수있는 가장 쉬운 방법입니다.
가장 간단한 방법은
dateparser.parse
모듈의 대부분의 기능을 둘러싼 기능 을 사용하는 것입니다.
샘플 코드 :
import dateparser
t1 = 'Jun 1 2005 1:33PM'
t2 = 'Aug 28 1999 12:00AM'
dt1 = dateparser.parse(t1)
dt2 = dateparser.parse(t2)
print(dt1)
print(dt2)
산출:
2005-06-01 13:33:00
1999-08-28 00:00:00
내 답변을 참조하십시오 .
실제 데이터에서 이것은 실제 문제입니다. 여러 개의 불일치, 불완전한, 일관성이없고 다국어 / 지역 날짜 형식은 종종 하나의 데이터 세트에서 자유롭게 혼합됩니다. 생산 코드가 실패하는 것은 좋지 않습니다. 여우처럼 예외적으로 행복하지 마십시오.
우리는 시도해야합니다 ... 여러 날짜 시간 형식 fmt1, fmt2, ..., fmtn을 포착하고 strptime()
불일치하는 모든 사람들에 대해 예외를 억제 / 처리해야합니다 ( 특히, 묵시적 인 n-들여 쓰기 시도 사다리가 필요하지 않음) ..catch 절). 에서 내 솔루션
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
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
언급 한 parse_dates
옵션 을 사용 read_csv
하면 문자열 날짜 시간을 팬더 날짜 시간 형식으로 변환 할 수 있습니다.
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
strptime()
당신이 그것을 포장하지 않는 한, 당신에게 견과류를 운전합니다. 를 기반으로 내 대답을 참조하십시오 여기에 또는 웨이즈 응답