programing

문자열 "Jun 1 2005 1:33"을 변환합니다.PM"에서 날짜/시간으로

javaba 2022. 10. 26. 21:23
반응형

문자열 "Jun 1 2005 1:33"을 변환합니다.PM"에서 날짜/시간으로

다음 문자열을 개체로 변환하려면 어떻게 해야 합니까?

"Jun 1 2005  1:33PM"

datetime.strptime 는 사용자 지정 형식의 입력 문자열을 타임존 오브젝트로 해석합니다.

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

기존 개체를 사용하여 개체를 가져오려면datetime오브젝트, 변환, 사용.date():

>>> datetime.strptime('Jun 1 2005', '%b %d %Y').date()
date(2005, 6, 1)

링크:

주의:

  • strptime= "문자열 해석 시간"
  • strftime= "문자열 형식 시간"

서드파티 라이브러리 사용:

from dateutil import parser
parser.parse("Aug 28 1999 12:00AM")  # datetime.datetime(1999, 8, 28, 0, 0)

대부분의 날짜 형식을 처리할 수 있으며 보다 편리합니다.strptime보통 정확한 형식을 추측하기 때문입니다.또한 성능보다 가독성이 더 중요한 쓰기 테스트에도 매우 유용합니다.

설치 방법:

pip install python-dateutil

타임 모듈에서 strptime을 확인합니다.그것은 스트레이트 타임의 반대이다.

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

Python > = 3.7

를 사용하여 YYY-MM-DD 문자열을 datetime 객체로 변환할 수 있습니다.

from datetime import datetime

date_string = "2012-12-12 10:10:10"
print (datetime.fromisoformat(date_string))
2012-12-12 10:10:10

문서의 주의사항:

이것은 임의의 ISO 8601 문자열의 해석은 지원하지 않습니다.의 역연산을 목적으로 하고 있을 뿐입니다. 보다 완전한 기능을 갖춘 ISO 8601 파서,dateutil.parser.isoparse는 서드파티 패키지에 포함되어 있습니다.

정말 깔끔한 표현을 변환할 수 있는 프로젝트를 준비했습니다.타임링을 확인합니다.

다음은 몇 가지 예입니다.

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

이 점에 유의하여 날짜 변환 시 다시 혼동할 필요가 없습니다.

datetime 개체에 대한 문자열 =strptime

다른 형식의 datetime 개체 =strftime

Jun 1 2005 1:33PM

와 같다

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

%b 로케일의 생략형 이름(Jun)으로서의 달

%d 제로 패드의 10진수로서의 월의 일(1)

세기를 10진수로 하는 %Y년(2015년)

제로 패드의 10진수(01)로서 %I Hour(12시간 시계)

0 패드의 10진수로서 %M분(33)

%p 로케일은 AM 또는 PM(PM)에 해당합니다.

스트렙타임 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

만약 당신이 판다나 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를 사용하여 이물질이 시스템에 들어올 때마다 타임존을 부착해야 합니다.

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

이것은 오프셋을 알고 있다고 가정합니다.를 알고 있지 않은, 를 들어 위치를 를 할 수 .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>)

7시간34분이라는 기이한 말은 시카고의 경도에서 유래했다.이 타임스탬프는 시카고에서 표준화된 시간이 채택되기 직전이기 때문에 사용하였습니다.

문자열이 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]]]]

서 ''는*는 임의의 단일 문자와 일치합니다.이쪽이쪽도 참조해 주세요.

다음은 Panda를 사용하여 문자열 형식의 날짜를 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특별한 것이 필요한 경우는, 문서를 확인해 주세요.

마찬가지로 타임스탬프에는 액세스 할 수 있는 많은 속성 및 메서드가 있습니다..date

으로 이 하는 것이 좋습니다.parsermodule은 이 질문에 대한 두 번째 답변으로 동작하기 위해 문자열 리터럴을 구성할 필요가 없기 때문에 아름답습니다., 한 가지 단점은 다음과 같은 답변보다 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 타임존 대응 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:

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/ 를 참조해 주세요.

체크 아웃도 가능합니다.

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

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

결과 값은 날짜 형식으로 가져옵니다.

위의 Javed와 마찬가지로 문자열에서 날짜를 찾고 싶었기 때문에 Simon과 Javed의 논리(위)를 조합하면 다음과 같은 결과가 나옵니다.

from dateutil import parser
import datetime

s='2021-03-04'

parser.parse(s).date()

산출량

datetime.date(2021, 3, 4)

팬더를 이용하는 것이 가장 빠른 것 같다. 타임스탬프

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)

당신이 가 if if if ifdon't 싶다explicitly specify 중 하나죠.format은 날짜 의 경우 이 형식을 할 수 .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

을 원하는 . 를 들어, 른른시른 / you시 you you you with with with with시시 if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if 。 예를 들어 다음과 같습니다.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

위의 sniipet을 실행하여 보다 명확한 정보를 얻으십시오.감사해요.

내 답을 봐.

실제 데이터에서는 이것이 문제입니다.복수, 불일치, 불완전, 불일치, 다국어/지역 날짜 형식이 종종 하나의 데이터셋에서 자유롭게 혼합됩니다.여우처럼 예외적으로 기뻐하는 것은 고사하고 프로덕션 코드가 실패하는 것은 좋지 않습니다.

형식 , ' fmt1, fmt2, ...fmtn'에서)를 억제/.strptime()일치하지 않는 모든 것에 대해서(특히, 육감적인 n-deep의 움푹 패인 사다리는 필요 없습니다).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()

"Start Date Time(시작 날짜 시간)" 열과 "Last Login Time(마지막 로그인 시간)"은 모두 데이터 프레임의 "object = strings(개체 = 문자열)"입니다.

<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_csvformat.string datetime 팬더 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

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

언급URL : https://stackoverflow.com/questions/466345/convert-string-jun-1-2005-133pm-into-datetime

반응형