다음과 같은 날짜-시간 목록이 문자열로 되어 있습니다.
Jun 1 2005 1:33PM Aug 28 1999 12:00AM
이것들을 데이터베이스의 적절한 날짜/시간 필드에 다시 밀어 넣을 것이므로 실제 날짜/시간 개체로 마법을 걸어야 합니다.
이것은 Django의 ORM을 통과하므로 SQL을 사용하여 삽입 시 변환을 수행할 수 없습니다.
질문자 :Oli
다음과 같은 날짜-시간 목록이 문자열로 되어 있습니다.
Jun 1 2005 1:33PM Aug 28 1999 12:00AM
이것들을 데이터베이스의 적절한 날짜/시간 필드에 다시 밀어 넣을 것이므로 실제 날짜/시간 개체로 마법을 걸어야 합니다.
이것은 Django의 ORM을 통과하므로 SQL을 사용하여 삽입 시 변환을 수행할 수 없습니다.
datetime.strptime
은 문자열을 datetime으로 구문 분석하는 주요 루틴입니다. 그것은 당신이 제공한 형식 문자열에 의해 결정된 형식으로 모든 종류의 형식을 처리할 수 있습니다.
from datetime import datetime datetime_object = datetime.strptime('Jun 1 2005 1:33PM', '%b %d %Y %I:%M%p')
결과 datetime
객체는 timezone-naive입니다.
연결:
strptime
/ strftime
형식 문자열에 대한 Python 문서 : Python 2 , Python 3
strftime.org 는 또한 strftime에 대한 정말 좋은 참조입니다.
노트:
strptime
= "문자열 구문 분석 시간"strftime
= "문자열 형식 시간"타사 dateutil 라이브러리를 사용합니다.
from dateutil import parser parser.parse("Aug 28 1999 12:00AM") # datetime.datetime(1999, 8, 28, 0, 0)
구문 분석해야 하는 형식을 포함하여 대부분의 날짜 형식을 처리할 수 있습니다. 대부분의 경우 올바른 형식을 추측할 수 있으므로 strptime
보다 더 편리합니다.
성능보다 가독성이 더 중요한 테스트를 작성할 때 매우 유용합니다.
다음을 사용하여 설치할 수 있습니다.
pip install python-dateutil
time 모듈에서 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)
정말 깔끔한 표현을 변환할 수 있는 프로젝트를 준비했습니다. 타임스트링을 확인하세요.
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))
날짜 객체로 변환 YYYY-MM-DD 문자열, datetime.fromisoformat
사용될 수있다.
from datetime import datetime date_string = "2012-12-12 10:10:10" print (datetime.fromisoformat(date_string)) 2012-12-12 10:10:10
이것을 기억하면 날짜/시간 변환에서 다시 혼동할 필요가 없습니다.
datetime 객체에 대한 문자열 = strptime
datetime 객체를 다른 형식으로 변환 = strftime
Jun 1 2005 1:33PM
와 같다
%b %d %Y %I:%M%p
%b 로케일의 축약된 이름인 월(6월)
%d 0으로 채워진 십진수로 된 월의 일(1)
%Y 십진수로 세기를 포함하는 연도(2015)
0으로 채워진 십진수(01)로서의 %I 시간(12시간제)
%M 0으로 채워진 십진수로 분(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)]
많은 타임스탬프에는 묵시적 시간대가 있습니다. 코드가 모든 시간대에서 작동하도록 하려면 내부적으로 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)))
이것은 오프셋을 알고 있다고 가정합니다. 그렇지 않지만 위치를 알고 있는 경우 pytz
패키지를 사용하여 오프셋에 대한 IANA 시간대 데이터베이스를 쿼리할 수 있습니다. 30분 오프셋이 있기 때문에 여기에서 테헤란을 예로 사용하겠습니다.
>>> tehran = pytz.timezone("Asia/Tehran") >>> local_time = tehran.localize( ... datetime.datetime.strptime("March 5, 2014, 20:13:50", ... "%B %d, %Y, %H:%M:%S") ... ) >>> local_time datetime.datetime(2014, 3, 5, 20, 13, 50, tzinfo=<DstTzInfo 'Asia/Tehran' +0330+3:30:00 STD>)
보시다시피, pytz
는 오프셋이 해당 특정 날짜에 +3:30이라고 결정했습니다. 이제 이것을 UTC 시간으로 변환할 수 있으며 오프셋이 적용됩니다.
>>> utc_time = local_time.astimezone(pytz.utc) >>> utc_time datetime.datetime(2014, 3, 5, 16, 43, 50, tzinfo=<UTC>)
시간대를 채택하기 전 날짜는 이상한 오프셋을 제공합니다. IANA가 Local Mean Time 을 사용하기로 결정했기 때문입니다.
>>> chicago = pytz.timezone("America/Chicago") >>> weird_time = chicago.localize( ... datetime.datetime.strptime("November 18, 1883, 11:00:00", ... "%B %d, %Y, %H:%M:%S") ... ) >>> weird_time.astimezone(pytz.utc) datetime.datetime(1883, 11, 18, 7, 34, tzinfo=<UTC>)
이상한 34초는 시카고의 경도에서 파생됩니다. 시카고에서 표준시가 채택된 날 이기 때문에 이 날짜를 사용했습니다.
다음은 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)]
to_datetime
사용하여 문자열을 Pandas Timestamps로 변환하는 옵션이 많이 있으므로 특별한 것이 필요한 경우 문서를 확인하세요.
마찬가지로 타임스탬프에는 .date
외에도 액세스할 수 있는 많은 속성과 메서드가 있습니다.
parser
모듈을 사용하는 솔루션을 좋아합니다. 이 솔루션은 작동하기 위해 문자열 리터럴을 구성할 필요가 없기 때문에 아름답습니다. 그러나 한 가지 단점은 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
이것을 백만 번 반복하지 않는 한, 나는 여전히 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
문자열이 ISO8601 형식이고 Python 3.7 이상이 있는 경우 다음 간단한 코드를 사용할 수 있습니다.
import datetime aDate = datetime.date.fromisoformat('2020-10-04')
날짜 및
import datetime aDateTime = datetime.datetime.fromisoformat('2020-10-04 22:47:00')
날짜와 시간을 포함하는 문자열의 경우. 타임스탬프가 포함된 경우 datetime.datetime.isoformat()
함수는 다음 형식을 지원합니다.
YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]
Django Timezone 인식 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.
다음과 같은 작은 유틸리티 함수를 만듭니다.
def date(datestr="", format="%Y-%m-%d"): from datetime import datetime if not datestr: return datetime.today().date() return datetime.strptime(datestr, format).date()
이것은 충분히 다재다능합니다:
문자열을 datetime 및 표준 시간대로 변환하는 데 도움이 될 것입니다.
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')
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
날짜 형식만 원하는 경우 다음과 같은 개별 필드를 전달하여 수동으로 변환할 수 있습니다.
>>> 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]))
결과 값을 날짜 형식으로 가져옵니다.
pandas Timestamp 를 사용하는 것이 가장 빠른 것 같습니다.
import pandas as pd N = 1000 l = ['Jun 1 2005 1:33PM'] * N list(pd.to_datetime(l, format=format)) %timeit _ = list(pd.to_datetime(l, format=format)) 1.58 ms ± 21.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
기타 솔루션
from datetime import datetime %timeit _ = list(map(lambda x: datetime.strptime(x, format), l)) 9.41 ms ± 95.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) from dateutil.parser import parse %timeit _ = list(map(lambda x: parse(x), l)) 73.8 ms ± 1.14 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
문자열이 ISO8601 문자열 이면 csio8601을 사용하십시오.
import ciso8601 l = ['2014-01-09'] * N %timeit _ = list(map(lambda x: ciso8601.parse_datetime(x), l)) 186 µs ± 4.13 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
내 대답을 참조하십시오.
실제 데이터에서 이것은 하나의 데이터 세트에 종종 자유롭게 혼합되는 다중, 불일치, 불완전, 불일치 및 다중 언어/지역 날짜 형식과 같은 실제 문제입니다. 프로덕션 코드가 실패하는 것은 좋지 않습니다. 여우처럼 예외적으로 행복해지는 것은 말할 것도 없고요.
여러 날짜/시간 형식 fmt1,fmt2,...,fmtn을 catch하고 일치하지 않는 모든 항목에 대해 (특히 strptime()
try..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
read_csv
언급에서 parse_dates
옵션을 사용하여 문자열 datetime을 pandas datetime 형식으로 변환할 수 있습니다.
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
yyyy-mm-dd 날짜 문자열을 datetime.date 객체에 매핑하는 짧은 샘플:
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')
날짜 시간 형식과 관련하여 문자열의 format
을 explicitly specify
don't
hack to by pass that step
수 있습니다.
from dateutil.parser import parse # function that'll guess the format and convert it into python datetime format def update_event(start_datetime=None, end_datetime=None, description=None): if start_datetime is not None: new_start_time = parse(start_datetime) return new_start_time #sample input dates in different format d = ['06/07/2021 06:40:23.277000','06/07/2021 06:40','06/07/2021'] new = [update_event(i) for i in d] for date in new: print(date) # sample output dates in python datetime object # 2014-04-23 00:00:00 # 2013-04-24 00:00:00 # 2014-04-25 00:00:00
date.strftime('%Y/%m/%d %H:%M:%S.%f')
과 같이 원하는 형식으로 마지막 줄을 수정하십시오. date.strftime('%Y/%m/%d %H:%M:%S.%f')
:-
from dateutil.parser import parse def update_event(start_datetime=None, end_datetime=None, description=None): if start_datetime is not None: new_start_time = parse(start_datetime) return new_start_time #sample input dates in different format d = ['06/07/2021 06:40:23.277000','06/07/2021 06:40','06/07/2021'] # passing the dates one by one through the function new = [update_event(i) for i in d] for date in new: print(date.strftime('%Y/%m/%d %H:%M:%S.%f')) # sample output dates in required python datetime object #2021/06/07 06:40:23.277000 #2021/06/07 06:40:00.000000 #2021/06/07 00:00:00.000000
더 명확하게 하려면 위의 스니펫을 실행해 보십시오. 감사 해요
출처 : http:www.stackoverflow.com/questions/466345/converting-string-into-datetime
목록의 마지막 요소를 얻는 방법은 무엇입니까? (0) | 2021.11.23 |
---|---|
npm 설치를 위한 --save 옵션은 무엇입니까? (0) | 2021.11.23 |
jQuery를 사용하여 드롭다운 목록(선택 상자)에서 선택한 텍스트 가져오기 (0) | 2021.11.23 |
Python에서 문자열의 하위 문자열을 얻으려면 어떻게 해야 합니까? (0) | 2021.11.19 |
새 탭이 아닌 새 탭에서 URL 열기 (0) | 2021.11.19 |