파이썬 strftime-0이없는 날짜?


277

Python을 사용할 때 strftime날짜의 첫 번째 0을 10 일 이전에 제거하는 방법이 있습니까? 그래서01 이다 1? %그 것을 찾을 수 없습니까 ?

감사!

답변:


568

실제로 나는 같은 문제가 있었고 %문자와 문자 사이에 하이픈을 추가 하면 선행 0을 제거 할 수 있음을 깨달았습니다 .

예를 들면 %Y/%-m/%-d.

이것은 Windows (Cygwin 포함)가 아닌 Unix (Linux, OS X)에서만 작동합니다. Windows에서는 #예 를 들어을 사용 %Y/%#m/%#d합니다.


11
나에게조차 일을하는 ValueError를 (윈도우, 파이썬 2.6) 제공합니까
rocketmonkeys

14
그것은 OS X에서 나를 위해 일했지만 python.org의 Python 2.7.2를 사용하고 있습니다.
Tim Swast 2016 년

13
@moose 나는 이것에 대해 질문했다 :-) 여기에 대답이있다-> stackoverflow.com/questions/28894172/…
Mathias

10
나는 얻는다 ValueError: '-' is a bad directive in format '%b %-d, %Y'. OSX, Python 2.7.
Richard

8
%#dWindows에서 동일하게 작동
dalle

190

우리는 format파이썬 2.6 이후 메소드 의 출현으로 이런 종류의 일을 할 수 있습니다 .

>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'

아마도 원래 질문의 범위를 벗어나더라도 더 흥미로운 형식의 경우 다음과 같은 작업을 수행 할 수 있습니다.

>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'

python3.6부터는 인라인 형식의 문자열 로 표현할 수 있습니다 .

Python 3.6.0a2 (v3.6.0a2:378893423552, Jun 13 2016, 14:44:21) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> dt = datetime.datetime.now()
>>> f'{dt:%A} {dt:%B} {dt.day}, {dt.year}'
'Monday August 29, 2016'

2
아주 좋아요! 와 같은 텍스트 표현을 사용하려는 경우 불행히도 혼자 작동하지 않습니다 time.strftime('%A %B %d, %Y')(이제 영어 로케일) Tuesday October 07, 2014.
Pekka Klärck

@ PekkaKlärck-지금까지 당신의 의견을 눈치 채지 못한 이유가 있습니다. datetime __format__은 그런 것을 쓸 수 있는 매우 흥미로운 후크를 지정 합니다.
mgilson

2
한 가지 문제는 '{dt.hour}'24 시간 시계 를 사용 한다는 것 입니다. (. 두 번째 옵션을 사용하면 여전히 '{%#I}'Windows와 '{%-I}'Unix 에서 다시 사용할 수 있습니다 .
ubomb

좋은 지적. 코드에서 12 시간 시계 표현을 사용하지 않으므로 그 경우를 생각하지 않았습니다.
mgilson

형식 기능에 대한이 추가 문서를 살펴 보는 것이 좋습니다. pyformat.info
Mark

37

http://docs.python.org/library/time.html% 에 따르면 일부 플랫폼은 문자와 문자 사이의 너비와 정밀도 사양 (예 : 'd'와 같은)을 지원할 수 있지만 반드시 이식 할 수는 없습니다. 솔루션 (예 : 내 Mac에서는 작동하지 않습니다 ;-). 어쩌면 당신은 그것을 해결 한 후에 문자열 바꾸기 (또는 실제로 불쾌한 형식의 경우 RE)를 사용할 수 있습니까? 예 :strftime

>>> y
(2009, 5, 7, 17, 17, 17, 3, 127, 1)
>>> time.strftime('%Y %m %d', y)
'2009 05 07'
>>> time.strftime('%Y %m %d', y).replace(' 0', ' ')
'2009 5 7'

@guneysus 무슨 뜻인가요? '2000 년 1 월 1 일'
사용자

6
@User 위 코드는 "2000 년 1 월 1 일"이없는 경우 0보다 먼저 공백을 확인합니다.
Alagappan Ramu

@alex이 답변을 삭제하십시오. 정답과는 거리가 먼 것 같습니다.
CONvid19

29

다음strftime()GNU C 라이브러리에서 지원되는 수정 자의 설명서입니다 . (사람들이 이전에 말했듯이 이식성이 없을 수도 있습니다.) 관심있는 것은 다음과 같습니다.

  • %e대신 %d월의 선행 0을 공백으로 바꿉니다.

내 파이썬 (Linux)에서 작동합니다. 그것이 당신에게 효과가 있는지 모르겠습니다.


3
Python 2.6이 설치된 Windows에서 % e가 실패합니다. 나는 그것이 nix에 특정한 것 같아요. 너무 나쁘다 :(
rocketmonkeys

1
이것은 최소한 * nix 시스템에서 가장 깨끗하고 가장 일반적인 솔루션입니다. 이것은 OS X에서 작동합니다.
BFTM

%-d , 파이썬 2.7.2와 OS X 10.8.5에서이 작품,하지만 윈도우에서 파이썬 2.7.3 7 프로 64 비트.
Johan

1
이것은 Python 3.5.1이 설치된 Windows 7 SP1에서 나를 위해 일했습니다.
Neil Billingham

1
이것은 앞에 오는 0 대신 여분의 공간을 도입했기 때문에 정확한 일치를 찾고 있다면 그렇지 않을 수 있습니다. >>> one = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime ( '% b % e % H') '5 월 1 일 23 일'>>> 11 일 = datetime .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> eleven.strftime ( '% b % e % H') '5 월 11 일 23 일'
hebeha

28
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'

1
이것은 2000 년 1 월 1 일에 작동하지만 Alexs 는 작동하지 않습니다.
guneysus

요점은 무엇입니까 .replace('X0','X').replace('X','')? 그냥 .replace('X0', '')하시면 좋을 것입니다.
Marco Bonelli

2
@MarcoBonelli : "X12 / X12 / 14"문자열에 대한 제안을 시도하면 알 수 있습니다.
gdw2

1
이것은 해킹이지만 파이톤 해킹입니다.
Josh M.



10

Django 템플릿 날짜 형식 필터가 빠르고 쉽다는 것을 알았습니다. 선행 0을 제거합니다. Django 모듈을 가져 오는 것이 마음에 들지 않으면 확인하십시오.

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

from django.template.defaultfilters import date as django_date_filter
print django_date_filter(mydate, 'P, D M j, Y')    

나와 같고 django에서 앱을 빌드하지 않는 경우 django에 구성 할 필요가 없다고 알려야합니다.import django.conf django.conf.settings.configure()
Alex Pretzlav

8

다음을 살펴보십시오 -.

>>> from datetime import datetime
>>> datetime.now().strftime('%d-%b-%Y')
>>> '08-Oct-2011'
>>> datetime.now().strftime('%-d-%b-%Y')
>>> '8-Oct-2011'
>>> today = datetime.date.today()
>>> today.strftime('%d-%b-%Y')
>>> print(today)

Python 3에서 완벽하게 작동
Saurabh

이것은 정답입니다. 매우 간단하고 기억하기 쉬운 질문을합니다. 문서를 빠르게 탐색하면이 정보를 찾을 수 없었습니다.
Lucas Lima

1
"이 답변은 받아 들여 져야합니다". Linux에서만 작동하기 때문에 아닙니다.
user136036


3

%d사용하여 정수로 변환 할 수 있으면 int()선행 0을 자동으로 제거하고 정수가됩니다. 그런 다음을 사용하여 문자열로 다시 변환 할 수 있습니다 str().


2
OP 질문은 str ()과 관련된 롤업 솔루션이 아닌 strftime 호출에서 형식 지정자를 사용하는 솔루션에 대한 것입니다.
Dave Hooper

큰 대답, 데이브 후퍼의 말을 듣지 마십시오
Toskan

3

예를 들어 "% -d"를 사용하면 동일한 OS의 다른 버전 간에도 이식성이 없습니다. 더 나은 솔루션은 날짜 구성 요소를 개별적으로 추출하고 날짜 별 형식 지정 연산자와 각 구성 요소에 대한 날짜 특성 액세스 중에서 선택하는 것입니다.

e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)

2

파이썬은 실제로 strftime(3)플랫폼 에서 C 언어 함수를 호출하기 때문에 선행 0을 제어하는 ​​데 사용할 수있는 형식 문자가있을 수 있습니다. 시험man strftime 하고보십시오. 그러나 물론 파이썬 매뉴얼이 알려주 듯이 결과는 이식성이 없습니다. :-)

나는 새로운 스타일의 사용하려고 할 것 datetime같은 속성을 가지고있는 대신 개체 t.yeart.montht.day와를 통해 그 넣어 정상, 고성능의 서식 %앞에 0을 지원하는 제어를 수행 연산자. 자세한 내용은 http://docs.python.org/library/datetime.html 을 참조하십시오. 더 나은 방법은, "".format()파이썬이 가지고 있고 더 현대적이라면 연산자를 사용하십시오 . 숫자에 대한 많은 형식 옵션이 있습니다. http://docs.python.org/library/string.html#string-formatting을 참조 하십시오 .


2

Alex의 방법에 따라 문자열 시작 및 공백 후 모두에서 작동합니다.

re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")

나는 크로스 플랫폼이며 strftime을 계속 사용할 수 있기 때문에 .format 또는 % -d보다 이것을 더 좋아합니다 ( "11 월"및 "월요일"과 같은 것을 얻을 수 있음).


1

오래된 질문이지만 % l (소문자 L)은 strftime에서 저에게 효과적이었습니다. 이것은 내가 찾은 Python 문서에 나열되어 있지 않으므로 모든 사람에게 효과가 없을 수 있습니다


1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")

이것은 선행 0을 공백으로 대체합니다. 이것은 OP가 요구 한 것이 아닙니다
Dave Hooper

ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'python 3.5 사용
ji-ruh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.