409

When using Python strftime, is there a way to remove the first 0 of the date if it's before the 10th, ie. so 01 is 1? Can't find a %thingy for that?

Thanks!

bluish
  • 26,356
  • 27
  • 122
  • 180
Solihull
  • 6,779
  • 5
  • 22
  • 12

22 Answers22

790

Actually I had the same problem and I realized that, if you add a hyphen between the % and the letter, you can remove the leading zero.

For example %Y/%-m/%-d.

This only works on Unix (Linux, OS X), not Windows (including Cygwin). On Windows, you would use #, e.g. %Y/%#m/%#d.

C S
  • 1,363
  • 1
  • 17
  • 26
Ryan
  • 7,973
  • 2
  • 15
  • 2
213

We can do this sort of thing with the advent of the format method since python2.6:

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

Though perhaps beyond the scope of the original question, for more interesting formats, you can do stuff like:

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

And as of python3.6, this can be expressed as an inline formatted string:

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'
mgilson
  • 300,191
  • 65
  • 633
  • 696
  • 4
    Very nice! Unfortunately doesn't work alone if you want to use textual representation like `time.strftime('%A %B %d, %Y')`, which yields (now, on English locale) `Tuesday October 07, 2014`. – Pekka Klärck Oct 07 '14 at 14:48
  • @PekkaKlärck -- Some reason I hadn't noticed your comment until now. It turns out that datetime specifies a very interesting `__format__` hook that allows you to write things like that. – mgilson Dec 04 '14 at 00:26
  • 4
    One problem is that `'{dt.hour}'` uses a 24 hour clock :(. Using the second option still brings you back to using `'{%#I}'` on Windows and `'{%-I}'` on Unix. – ubomb May 24 '16 at 22:47
  • Good point. I never use 12 hour clock representations in code, so I didn't think of that case. – mgilson May 24 '16 at 22:48
  • I'd suggest looking at this additional documentation on the format functionality: https://pyformat.info/ – Mark Sep 02 '16 at 02:23
46

Some platforms may support width and precision specification between % and the letter (such as 'd' for day of month), according to http://docs.python.org/library/time.html -- but it's definitely a non-portable solution (e.g. doesn't work on my Mac;-). Maybe you can use a string replace (or RE, for really nasty format) after the strftime to remedy that? e.g.:

>>> 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'
Alex Martelli
  • 854,459
  • 170
  • 1,222
  • 1,395
40

Here is the documentation of the modifiers supported by strftime() in the GNU C library. (Like people said before, it might not be portable.) Of interest to you might be:

  • %e instead of %d will replace leading zero in day of month with a space

It works on my Python (on Linux). I don't know if it will work on yours.

newacct
  • 119,665
  • 29
  • 163
  • 224
  • 4
    %e fails for me on Windows w/ Python 2.6. I'm guessing it's *nix specific. Too bad :( – rocketmonkeys Nov 30 '10 at 14:27
  • 1
    This is the cleanest, most general, solution---on a *nix system, at least. This works on OS X. – BFTM Sep 10 '13 at 05:20
  • 1
    Like the `%-d` [above](http://stackoverflow.com/a/2073189/1447415), this works in OS X 10.8.5 with Python 2.7.2, but not in Windows 7 Pro 64-bit with Python 2.7.3. – Johan Nov 08 '13 at 10:59
  • 2
    This worked for me on Windows 7 SP1 with Python 3.5.1. – Neil Billingham Oct 19 '18 at 09:59
  • 1
    This introduced an extra space instead of the leading zero so if you are looking for an exact match this may not be it. >>> one = datetime.datetime(2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime('%b %e %H') 'May 1 23' >>> eleven = datetime.datetime(2019, 5, 11, 23, 28, 48, 175214) >>> eleven.strftime('%b %e %H') 'May 11 23' – hebeha May 13 '19 at 06:40
  • Works with modern pandas/python – johnDanger Sep 17 '22 at 01:05
37
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'
gdw2
  • 7,558
  • 4
  • 46
  • 49
26

On Windows, add a '#', as in '%#m/%#d/%Y %#I:%M:%S %p'

For reference: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx

Chad Kennedy
  • 1,716
  • 13
  • 16
24

quite late to the party but %-d works on my end.

datetime.now().strftime('%B %-d, %Y') produces something like "November 5, 2014"

cheers :)

bonbon.langes
  • 1,718
  • 2
  • 22
  • 37
11

Take a look at - bellow:

>>> 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)
bluish
  • 26,356
  • 27
  • 122
  • 180
ptronico
  • 575
  • 5
  • 5
10

I find the Django template date formatting filter to be quick and easy. It strips out leading zeros. If you don't mind importing the Django module, check it out.

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')    
mcqwerty
  • 3,386
  • 2
  • 25
  • 24
  • Note that if you're like me and you're not building your app in django, you'll need to tell django you don't need to configure it: `import django.conf` `django.conf.settings.configure()` – Alex Pretzlav Jan 29 '12 at 01:21
8

simply use replace like this:

(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")

it will output:

'2017/7/21'
Athena
  • 3,200
  • 3
  • 27
  • 35
  • This unfortunately does not work for dates formatted like 1.4.2021 (1st of April 2021); it could catch the zero in months, but not for the days (using "01.04.2021".replace(".0",".") leads only to 01.4.2021) – Michal Skop Nov 23 '21 at 23:32
5

For %d you can convert to integer using int() then it'll automatically remove leading 0 and becomes integer. You can then convert back to string using str().

bluish
  • 26,356
  • 27
  • 122
  • 180
4

using, for example, "%-d" is not portable even between different versions of the same OS. A better solution would be to extract the date components individually, and choose between date specific formatting operators and date attribute access for each component.

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

if we want to fetch only date without leading zero we can

d = date.today()
day = int(d.strftime("%d"))
AliAxghar
  • 31
  • 1
2

Based on Alex's method, this will work for both the start-of-string and after-spaces cases:

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

I like this better than .format or %-d because this is cross-platform and allows me to keep using strftime (to get things like "November" and "Monday").

mmitchell
  • 621
  • 5
  • 22
2

Old question, but %l (lower-case L) worked for me in strftime: this may not work for everyone, though, as it's not listed in the Python documentation I found

OliverRadini
  • 6,238
  • 1
  • 21
  • 46
  • I am using a Python-based package (weather station software called WeeWX) that only lets me specify percent-sign formatting, like this - not the complicated string-substitution stuff like most of the above answers use. The "%l" worked for me! (on Linux) – Rob Cranfill Jul 11 '20 at 23:31
  • @RobCranfill Very glad to hear this came in handy for someone! I remember it solved a rather annoying problem for me at the time – OliverRadini Jul 12 '20 at 15:17
2
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")
Tunaki
  • 132,869
  • 46
  • 340
  • 423
2

Because Python really just calls the C language strftime(3) function on your platform, it might be that there are format characters you could use to control the leading zero; try man strftime and take a look. But, of course, the result will not be portable, as the Python manual will remind you. :-)

I would try using a new-style datetime object instead, which has attributes like t.year and t.month and t.day, and put those through the normal, high-powered formatting of the % operator, which does support control of leading zeros. See http://docs.python.org/library/datetime.html for details. Better yet, use the "".format() operator if your Python has it and be even more modern; it has lots of format options for numbers as well. See: http://docs.python.org/library/string.html#string-formatting.

bluish
  • 26,356
  • 27
  • 122
  • 180
Brandon Rhodes
  • 83,755
  • 16
  • 106
  • 147
1

Python 3.6+:

from datetime import date
today = date.today()
text = "Today it is " + today.strftime(f"%A %B {today.day}, %Y")
ItM
  • 301
  • 1
  • 5
  • 16
0

I am late, but a simple list slicing will do the work

today_date = date.today().strftime('%d %b %Y')
if today_date[0] == '0':
    today_date = today_date[1:]
zerocool
  • 1
  • 1
0

The standard library is good enough for most cases but for a really detailed manipulation with dates you should always look for some specialized third-party library.

Using Arrow:

>>> import arrow
>>> arrow.utcnow().format('dddd, D. M. YYYY')
'Friday, 6. 5. 2022'

Look at the full list of supported tokens.

Jeyekomon
  • 2,878
  • 2
  • 27
  • 37
0

A little bit tricky but works for me

ex. from 2021-02-01T00:00:00.000Z to 2021-02-1

from datetime import datetime

dateObj = datetime.strptime('2021-02-01T00:00:00.000Z','%Y-%m-%dT%H:%M:%S.%fZ')
dateObj.strftime('%Y-%m-{}').format(dateObj.day)

luno
  • 11
  • 3
0

An amateur approach to remove '0' prefix for Day & Month, by casting to 'int'

dt = "08/01/2023"
dtArr = d.split("/")
print(str(int(x[0]))+'/'+str(int(x[1]))+'/'+str(int(x[2])))
Avisek Chakraborty
  • 8,229
  • 10
  • 48
  • 76