Convierta la fecha de la cadena en una marca de tiempo en Python

How to convert a string in the format "%d/%m/%Y" to timestamp?

"01/12/2011" -> 1322697600

preguntado el 09 de marzo de 12 a las 16:03

What's the 2nd number? Unix Epoch time? -

@Hasteur, yes. The second number represents the number of seconds that have passed between the beginning of the unix epoch and the date specified. This format is also referred to as POSIX time. -

Time is passing very fast! you have asked this question at 13... and now is 16... -

16 Respuestas

>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0

respondido 09 mar '12, 16:03

it assumes midnight 01/12/2011 in local timezone. If input is in UTC; you could use calendar.timegm() or .toordinal() - jfs

datetime.datetime.strptime(s, "%d/%m/%Y").timestamp() es un poco más corto Tim Diels

@timdiels: again. .timestamp() asume locales time instead of UTC if no explicit timezone is given. The code in the answer works (produces expected 1322697600) only on a computer where local timezone has zero utc offset. - jfs

this doesn't work: datetime.datetime.strptime("2014:06:28 11:53:21", "%Y:%m:%d %H:%M:%S").timestamp() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'datetime.datetime' object has no attribute 'timestamp' - Zdenek Maxa

@ZdenekMaxa datetime.timestamp() available only for python >= 3.3 versions. docs.python.org/3/whatsnew/3.3.html - joni jones

yo suelo ciso8601, which is 62x faster than datetime's strptime.

t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())

Puedes aprender mas aquí.

Respondido 20 Oct 21, 11:10

this is a fantastic suggestion. i just used it and shaved TONS of time off of my execution. - David

My god this is fast - Hews

And +1 for not needing me to spell out what the time string format is. - gowenfawr

To convert the string into a date object:

from datetime import date, datetime

date_string = "01/12/2011"
date_object = date(*map(int, reversed(date_string.split("/"))))
assert date_object == datetime.strptime(date_string, "%d/%m/%Y").date()

The way to convert the date object into POSIX timestamp depends on timezone. From Conversión datetime.date a la marca de tiempo UTC en Python:

  • date object represents midnight in UTC

    import calendar
    
    timestamp1 = calendar.timegm(utc_date.timetuple())
    timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
    assert timestamp1 == timestamp2
    
  • date object represents midnight in local time

    import time
    
    timestamp3 = time.mktime(local_date.timetuple())
    assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())
    

The timestamps are different unless midnight in UTC and in local time is the same time instance.

contestado el 23 de mayo de 17 a las 13:05

When I run the examples in this post, I get the error: NameError: name 'wckCalendar' is not defined. I am running Python 3.4.1 on a Windows 32 bits machine. Any idea? Thanks. - sedeh

@sedeh there is no wckCalendar in the post. Check your code. - jfs

@J.F.Sebastian Exactly, and I wasn't trying to call wckCalendar directly. It just shows up in the error message. See my post aquí discussing the problem. - sedeh

@törzsmókus: If the answer is wrong, It doesn't matter how readable it is. - jfs

@törzsmókus: look at my answer: it may produce Dos different numbers. Your answer produces uno number without mentioning which one. - jfs

>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200

respondido 09 mar '12, 16:03

"%s" is not supported by Python. It is not portable. - jfs

La legibilidad cuenta. See my answer with dateutil for a far more human-readable solution. - törzsmókus

Sólo tiene que utilizar datetime.datetime.strptime:

import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())

Resultado:

1322697600

To use UTC instead of the local timezone use .replace:

datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()

Respondido el 21 de diciembre de 18 a las 20:12

For a complete anwser you must say that it is only valid for python 3.3+ - Eduardo

On the first example, the result is a float no int - Pedro Lobito

The answer depends also on your input date timezone. If your date is a local date, then you can use mktime() like katrielalex said - only I don't see why he used datetime instead of this shorter version:

>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0

But observe that my result is different than his, as I am probably in a different TZ (and the result is timezone-free UNIX timestamp)

Now if the input date is already in UTC, than I believe the right solution is:

>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600

Respondido 19 Abr '13, 11:04

I think this is better. No need to import both 'time' and 'datetime'. - kennyut

how to handle date in format "YYYY-MM-DD"? - n0obcoder

A lot of these answers don't bother to consider that the date is naive to begin with

To be correct, you need to make the naive date a timezone aware datetime first

import datetime
import pytz
# naive datetime
d = datetime.datetime.strptime('01/12/2011', '%d/%m/%Y')
>>> datetime.datetime(2011, 12, 1, 0, 0)

# add proper timezone
pst = pytz.timezone('America/Los_Angeles')
d = pst.localize(d)
>>> datetime.datetime(2011, 12, 1, 0, 0,
tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)

# convert to UTC timezone
utc = pytz.UTC
d = d.astimezone(utc)
>>> datetime.datetime(2011, 12, 1, 8, 0, tzinfo=<UTC>)

# epoch is the beginning of time in the UTC timestamp world
epoch = datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.UTC)
>>> datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)

# get the total second difference
ts = (d - epoch).total_seconds()
>>> 1322726400.0

También:

Tenga cuidado al usar pytz para tzinfo en un parche de datetime.datetime DOESN'T WORK for many timezones. See datetime with pytz timezone. Different offset depending on how tzinfo is set

# Don't do this:
d = datetime.datetime(2011, 12, 1,0,0,0, tzinfo=pytz.timezone('America/Los_Angeles'))
>>> datetime.datetime(2011, 1, 12, 0, 0, 
tzinfo=<DstTzInfo 'America/Los_Angeles' LMT-1 day, 16:07:00 STD>)
# tzinfo in not PST but LMT here, with a 7min offset !!!

# when converting to UTC:
d = d.astimezone(pytz.UTC)
>>> datetime.datetime(2011, 1, 12, 7, 53, tzinfo=<UTC>)
# you end up with an offset

https://en.wikipedia.org/wiki/Local_mean_time

Respondido el 13 de Septiembre de 17 a las 02:09

First you must the strptime class to convert the string to a struct_time format.

Entonces solo usa tiempo mk from there to get your float.

respondido 09 mar '12, 16:03

Yo sugeriría dateutil:

import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()

Respondido el 18 de Septiembre de 17 a las 13:09

It is wrong. OP expects time in "%d/%m/%Y" format. Compare: dateutil.parser.parse("01/02/2001") y datetime.strptime("01/02/2001", "%d/%m/%Y") - jfs

thanks @jfs, good catch. I updated my answer accordingly. (as a non-American, I wouldn’t have thought the illogical M/D/Y format was the default for the parser.) - törzsmókus

it doesn't produce the expected 1322697600 unless your local timezone is UTC. See my comment from 2014 - jfs

Seems to be quite efficient:

import datetime
day, month, year = '01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()

1.61 µs ± 120 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Respondido el 22 de diciembre de 18 a las 00:12

¿Cuál es la datetime ¿función? datetime from the datetime library doesn't support .timestamp() - Joooeey

@Joooeey: It does, on Python 3.3 or later. Wasn't available when the question was posted, but it's been available since Sept. of 2012. - ShadowRanger

you can convert to isoformat

my_date = '2020/08/08'
my_date = my_date.replace('/','-') # just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()

Respondido el 04 de junio de 20 a las 17:06

I would give a answer for beginners (like me):

You have the date string "01/12/2011". Then it can be written by the format "%d/%m/%Y". If you want to format to another format like "July 9, 2015", aquí a good cheatsheet.

  • Importar el datetime biblioteca.

  • Utilice el datetime.datetime class to handle date and time combinations.

  • Utilice el strptime method to convert a string datetime to a object datetime.

  • Finalmente, usa el timestamp method to get the Unix epoch time as a float. So,

import datetime
print( int( datetime.datetime.strptime( "01/12/2011","%d/%m/%Y" ).timestamp() ) )

# prints 1322712000

Respondido el 17 de Septiembre de 21 a las 17:09

You can refer this following link for using strptime funcionar desde datetime.datetime, to convert date from any format along with time zone.

https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior

Respondido 11 Abr '19, 13:04

just use datetime.timestamp(your datetime instanse), datetime instance contains the timezone infomation, so the timestamp will be a standard utc timestamp. if you transform the datetime to timetuple, it will lose it's timezone, so the result will be error. if you want to provide an interface, you should write like this: int(datetime.timestamp(time_instance)) * 1000

Respondido el 04 de diciembre de 16 a las 10:12

A simple function to get UNIX Epoch time.

NOTA: This function assumes the input date time is in UTC format (Refer to comentarios aquí).

def utctimestamp(ts: str, DATETIME_FORMAT: str = "%d/%m/%Y"):
    import datetime, calendar
    ts = datetime.datetime.utcnow() if ts is None else datetime.datetime.strptime(ts, DATETIME_FORMAT)
    return calendar.timegm(ts.utctimetuple())

Uso:

>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600

Respondido 01 Feb 20, 14:02

Se puede ir ambas direcciones, unix epoch <==> datetime :

import datetime
import time


the_date = datetime.datetime.fromtimestamp( 1639763585 )



unix_time = time.mktime(the_date.timetuple())

assert  ( the_date == datetime.datetime.fromtimestamp(unix_time) ) & \
        ( time.mktime(the_date.timetuple()) == unix_time         )   

Respondido el 17 de diciembre de 21 a las 18:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.