14

Given the following data frame and necessary wrangling:

import pandas as pd
df=pd.DataFrame({'A':['a','b','c'],
        'dates':['2015-08-31 00:00:00','2015-08-24 00:00:00','2015-08-25 00:00:00']})
df.dates=df.dates.astype(str)
df['dates'] = pd.to_datetime(df.dates.str.split(',\s*').str[0])
set(df['dates'])

I end up with:

{Timestamp('2015-08-24 00:00:00'),
 Timestamp('2015-08-25 00:00:00'),
 Timestamp('2015-08-31 00:00:00')}

I need to convert the time stamps back to datetime (really, just date) format.

I've tried this based on the answer to this post:

df['dates'].to_pydatetime()

But that returns:

AttributeError: 'Series' object has no attribute 'to_pydatetime'

In my real data, the data type is: <M8[ns]

Dharman
  • 30,962
  • 25
  • 85
  • 135
Dance Party
  • 3,459
  • 10
  • 42
  • 67
  • 1
    Possible duplicate of [Converting between datetime and Pandas Timestamp objects](http://stackoverflow.com/questions/22825349/converting-between-datetime-and-pandas-timestamp-objects) – Nickil Maveli Jun 05 '16 at 16:46
  • Please see edited post. I tried the method suggested in that post but it did not work for me. – Dance Party Jun 05 '16 at 17:21

6 Answers6

9

You can use dt.date to return a datetime.date object:

In [3]:
set(df['dates'].dt.date)

Out[3]:
{datetime.date(2015, 8, 24),
 datetime.date(2015, 8, 25),
 datetime.date(2015, 8, 31)}
EdChum
  • 376,765
  • 198
  • 813
  • 562
8

You can convert directly using apply:

df.dates = df.dates.apply(lambda x: x.date())

This makes an in-place conversion of the previous 'dates' (as a timestamp) to the truncated 'datetime' only portion

RexBarker
  • 1,456
  • 16
  • 14
2

I have a similar issue where I need to convert timestamp to datetime in numpy though, but I believe it can be apply in Pandas as well. I think using function under Pandas.Timestamp would be better to convert timestamp as below.

==============================

np1=pd.DataFrame.to_numpy(df2)
print(np1)
[[Timestamp('2019-01-31 00:00:00') 'UCHITEC'  2000 2.56 5129.54]
 [Timestamp('2019-01-16 00:00:00') 'UCHITEC'  1000 2.61 2618.79]]

np2= np.asarray(np1)
Timestamp('2019-01-16 00:00:00')

np3 = pd.Timestamp.to_datetime64(np2[0][0])
np4 = pd.Timestamp.to_pydatetime(np2[1][0])

print(np3)
print(np4)

2019-01-31T00:00:00.000000000
2019-01-16 00:00:00
M.abr
  • 61
  • 3
1

If you are keen on extracting only the date from a given Timestamp object, you can get the raw datetime.date objects by calling the unbound Timestamp.date method as shown:

import pandas as pd
from pandas import Timestamp, Series, date_range

start = Timestamp('2016-01-01')
stop = Timestamp('2016-01-02')
s = Series(date_range(start, stop, freq = 'H'))

print s[0]
2016-01-01 00:00:00

print s.map(Timestamp.date)[0]
2016-01-01
dtype: object
Nickil Maveli
  • 29,155
  • 8
  • 82
  • 85
1

this worked for me. df['time'] consist of a column of timestamps

df['time'] = df['time'].apply(lambda x: datetime.datetime.fromtimestamp(x).strftime('%Y-%m-%d'))

# i.e. x is a timestamp such as 1641772800 (or in date 2022-01-10)
1

You can convert a whole Timestamp column to an array of datetime.datetime objects like this:

dt_array = df['dates'].dt.to_pydatetime()
# dt_array is an array of datetime.datetime objects

BUT as soon as you try to use that array to create/overwrite a pandas column it will end up as a dtype='datetime64[ns]'). For instance, columns A and B below will be dtype='datetime64[ns]').

dt_array = df['dates'].dt.to_pydatetime()
# dt_array is an array of datetime.datetime objects
df['A'] = dt_array

# or in one line
df['B'] = df['dates'].dt.to_pydatetime()
jpobst
  • 3,491
  • 2
  • 25
  • 24