Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert datetime to integer in python

How can I convert YYYY-MM-DD hh:mm:ss format to integer in python? for example 2014-02-12 20:51:14 -> to integer.

I only know how to convert hh:mm:ss but not yyyy-mm-dd hh:mm:ss

def time_to_num(time_str):     hh, mm , ss = map(int, time_str.split(':'))     return ss + 60*(mm + 60*hh) 
like image 644
Tomáš Konyárik Avatar asked Jan 26 '15 16:01

Tomáš Konyárik


People also ask

How do I convert a datetime to an integer in Python?

strftime() object. In this method, we are using strftime() function of datetime class which converts it into the string which can be converted to an integer using the int() function. Returns : It returns the string representation of the date or time object.

How do I convert numeric to date in Python?

You can use the fromtimestamp function from the datetime module to get a date from a UNIX timestamp. This function takes the timestamp as input and returns the datetime object corresponding to the timestamp.

How do I convert datetime to seconds in Python?

To convert a datetime to seconds, subtracts the input datetime from the epoch time. For Python, the epoch time starts at 00:00:00 UTC on 1 January 1970. Subtraction gives you the timedelta object. Use the total_seconds() method of a timedelta object to get the number of seconds since the epoch.


2 Answers

It depends on what the integer is supposed to encode. You could convert the date to a number of milliseconds from some previous time. People often do this affixed to 12:00 am January 1 1970, or 1900, etc., and measure time as an integer number of milliseconds from that point. The datetime module (or others like it) will have functions that do this for you: for example, you can use int(datetime.datetime.utcnow().timestamp()).

If you want to semantically encode the year, month, and day, one way to do it is to multiply those components by order-of-magnitude values large enough to juxtapose them within the integer digits:

2012-06-13 --> 20120613 = 10,000 * (2012) + 100 * (6) + 1*(13)

def to_integer(dt_time):     return 10000*dt_time.year + 100*dt_time.month + dt_time.day 

E.g.

In [1]: import datetime  In [2]: %cpaste Pasting code; enter '--' alone on the line to stop or use Ctrl-D. :def to_integer(dt_time): :    return 10000*dt_time.year + 100*dt_time.month + dt_time.day :    # Or take the appropriate chars from a string date representation. :--  In [3]: to_integer(datetime.date(2012, 6, 13)) Out[3]: 20120613 

If you also want minutes and seconds, then just include further orders of magnitude as needed to display the digits.

I've encountered this second method very often in legacy systems, especially systems that pull date-based data out of legacy SQL databases.

It is very bad. You end up writing a lot of hacky code for aligning dates, computing month or day offsets as they would appear in the integer format (e.g. resetting the month back to 1 as you pass December, then incrementing the year value), and boiler plate for converting to and from the integer format all over.

Unless such a convention lives in a deep, low-level, and thoroughly tested section of the API you're working on, such that everyone who ever consumes the data really can count on this integer representation and all of its helper functions, then you end up with lots of people re-writing basic date-handling routines all over the place.

It's generally much better to leave the value in a date context, like datetime.date, for as long as you possibly can, so that the operations upon it are expressed in a natural, date-based context, and not some lone developer's personal hack into an integer.

like image 117
ely Avatar answered Oct 16 '22 02:10

ely


I think I have a shortcut for that:

# Importing datetime. from datetime import datetime  # Creating a datetime object so we can test. a = datetime.now()  # Converting a to string in the desired format (YYYYMMDD) using strftime # and then to int. a = int(a.strftime('%Y%m%d')) 
like image 36
Chicrala Avatar answered Oct 16 '22 00:10

Chicrala