Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

extracting days from a numpy.timedelta64 value

I am using pandas/python and I have two date time series s1 and s2, that have been generated using the 'to_datetime' function on a field of the df containing dates/times.

When I subtract s1 from s2

s3 = s2 - s1

I get a series, s3, of type

timedelta64[ns]

0    385 days, 04:10:36 1     57 days, 22:54:00 2    642 days, 21:15:23 3    615 days, 00:55:44 4    160 days, 22:13:35 5    196 days, 23:06:49 6     23 days, 22:57:17 7      2 days, 22:17:31 8    622 days, 01:29:25 9     79 days, 20:15:14 10    23 days, 22:46:51 11   268 days, 19:23:04 12                  NaT 13                  NaT 14   583 days, 03:40:39 

How do I look at 1 element of the series:

s3[10]

I get something like this:

numpy.timedelta64(2069211000000000,'ns')

How do I extract days from s3 and maybe keep them as integers(not so interested in hours/mins etc.)?

Thanks in advance for any help.

like image 229
user7289 Avatar asked Aug 13 '13 17:08

user7289


People also ask

How do I convert timedelta64 to int in Python?

Convert the timedelta to int Using the dt Attribute in Pandas. To convert the timedelta to an integer value, we can use the pandas library's dt attribute. The dt attribute allows us to extract components of the timedelta . For example, we can extract the year, month, day, minutes, or seconds using the dt attribute.

What is timedelta64?

timedelta64('nAt') numpy.timedelta64('NaT') Datetimes and Timedeltas work together to provide ways for simple datetime calculations. Example. >>> np. datetime64('2009-01-01') - np.

How do you convert days to integers in python?

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. Code: Python3.


2 Answers

You can convert it to a timedelta with a day precision. To extract the integer value of days you divide it with a timedelta of one day.

>>> x = np.timedelta64(2069211000000000, 'ns') >>> days = x.astype('timedelta64[D]') >>> days / np.timedelta64(1, 'D') 23 

Or, as @PhillipCloud suggested, just days.astype(int) since the timedelta is just a 64bit integer that is interpreted in various ways depending on the second parameter you passed in ('D', 'ns', ...).

You can find more about it here.

like image 146
Viktor Kerkez Avatar answered Sep 30 '22 10:09

Viktor Kerkez


Use dt.days to obtain the days attribute as integers.

For eg:

In [14]: s = pd.Series(pd.timedelta_range(start='1 days', end='12 days', freq='3000T'))  In [15]: s Out[15]:  0    1 days 00:00:00 1    3 days 02:00:00 2    5 days 04:00:00 3    7 days 06:00:00 4    9 days 08:00:00 5   11 days 10:00:00 dtype: timedelta64[ns]  In [16]: s.dt.days Out[16]:  0     1 1     3 2     5 3     7 4     9 5    11 dtype: int64 

More generally - You can use the .components property to access a reduced form of timedelta.

In [17]: s.dt.components Out[17]:     days  hours  minutes  seconds  milliseconds  microseconds  nanoseconds 0     1      0        0        0             0             0            0 1     3      2        0        0             0             0            0 2     5      4        0        0             0             0            0 3     7      6        0        0             0             0            0 4     9      8        0        0             0             0            0 5    11     10        0        0             0             0            0 

Now, to get the hours attribute:

In [23]: s.dt.components.hours Out[23]:  0     0 1     2 2     4 3     6 4     8 5    10 Name: hours, dtype: int64 
like image 35
Nickil Maveli Avatar answered Sep 30 '22 11:09

Nickil Maveli