Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert a column of datetimes to epoch in Python

I'm currently having an issue with Python. I have a Pandas DataFrame and one of the columns is a string with a date. The format is :

"%Y-%m-%d %H:%m:00.000". For example : "2011-04-24 01:30:00.000"

I need to convert the entire column to integers. I tried to run this code, but it is extremely slow and I have a few million rows.

for i in range(calls.shape[0]):
    calls['dateint'][i] = int(time.mktime(time.strptime(calls.DATE[i], "%Y-%m-%d %H:%M:00.000")))

Do you guys know how to convert the whole column to epoch time?

like image 843
marcsarfa Avatar asked Feb 25 '16 14:02

marcsarfa


People also ask

How do you convert time to epoch in Python?

Method 1: Using strftime() strftime() is used to convert string DateTime to DateTime. It is also used to convert DateTime to epoch. We can get epoch from DateTime from strftime().

How do you convert a column from epoch to datetime in Python?

The pd. to_datetime() function can be used to convert a column or a series object containing epoch time to readable date and time values in datetime type format. We can also specify the unit of the epoch time using the unit parameter.

How do I convert date to epoch?

Convert from human-readable date to epoch long epoch = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000; Timestamp in seconds, remove '/1000' for milliseconds. date +%s -d"Jan 1, 1980 00:00:01" Replace '-d' with '-ud' to input in GMT/UTC time.


3 Answers

convert the string to a datetime using to_datetime and then subtract datetime 1970-1-1 and call dt.total_seconds():

In [2]:
import pandas as pd
import datetime as dt
df = pd.DataFrame({'date':['2011-04-24 01:30:00.000']})
df

Out[2]:
                      date
0  2011-04-24 01:30:00.000

In [3]:
df['date'] = pd.to_datetime(df['date'])
df

Out[3]:
                 date
0 2011-04-24 01:30:00

In [6]:    
(df['date'] - dt.datetime(1970,1,1)).dt.total_seconds()

Out[6]:
0    1303608600
Name: date, dtype: float64

You can see that converting this value back yields the same time:

In [8]:
pd.to_datetime(1303608600, unit='s')

Out[8]:
Timestamp('2011-04-24 01:30:00')

So you can either add a new column or overwrite:

In [9]:
df['epoch'] = (df['date'] - dt.datetime(1970,1,1)).dt.total_seconds()
df

Out[9]:
                 date       epoch
0 2011-04-24 01:30:00  1303608600

EDIT

better method as suggested by @Jeff:

In [3]:
df['date'].astype('int64')//1e9

Out[3]:
0    1303608600
Name: date, dtype: float64

In [4]:
%timeit (df['date'] - dt.datetime(1970,1,1)).dt.total_seconds()
%timeit df['date'].astype('int64')//1e9

100 loops, best of 3: 1.72 ms per loop
1000 loops, best of 3: 275 µs per loop

You can also see that it is significantly faster

like image 188
EdChum Avatar answered Oct 19 '22 02:10

EdChum


I know this is old but I believe the correct (and cleanest) way is the single line below:

calls['DATE'].apply(lambda x: x.timestamp())

This assumes calls['DATE'] is a datetime64[ns] type. If not, convert it with:

pd.to_datetime(calls['DATE'], format="%Y-%m-%d %H:%m:00.000")

Explanation

To get the epoch value (in seconds) of a pd.Timestamp, use:

pd.Timestamp('20200101').timestamp()

This should give you 1577836800.0. You can cast to an int if you want. The reason it is a float is because any subsecond time will be in the decimal part.

For completeness, you can also get the raw epoch value (in nanoseconds) using this:

pd.Timestamp('20200101').value

Gives 1577836800000000000 which is the epoch of the date above. The .value attribute is the number of nanoseconds since epoch so we divide by 1e6 to get to milliseconds. Divide by 1e9 if you want epoch in seconds as the first call.

like image 31
s5s Avatar answered Oct 19 '22 01:10

s5s


From the Pandas documentation on working with time series data:

We subtract the epoch (midnight at January 1, 1970 UTC) and then floor divide by the “unit” (1 ms).

# generate some timestamps
stamps = pd.date_range('2012-10-08 18:15:05', periods=4, freq='D')

# convert it to milliseconds from epoch
(stamps - pd.Timestamp("1970-01-01")) // pd.Timedelta('1ms')

This will give the epoch time in milliseconds.

like image 10
ares Avatar answered Oct 19 '22 02:10

ares