There is a difference between
- the content of a dataframe cell (a binary value) and
- its presentation (displaying it) for us, humans.
So the question is: How to reach the appropriate presentation of my data without changing the data / data types themselves?
Here is the answer:
- If you use the Jupyter notebook for displaying your dataframe, or
- if you want to reach a presentation in the form of an HTML file (even with many prepared superfluous
id
and class
attributes for further CSS styling — you may or you may not use them),
use styling. Styling don't change data / data types of columns of your dataframe.
Now I show you how to reach it in the Jupyter notebook — for a presentation in the form of HTML file see the note near the end of this answer.
I will suppose that your column DOB
already has the datetime64
type (you have shown that you know how to reach it). I prepared a simple dataframe (with only one column) to show you some basic styling:
DOB
0 2019-07-03
1 2019-08-03
2 2019-09-03
3 2019-10-03
DOB
0 07/03/2019
1 08/03/2019
2 09/03/2019
3 10/03/2019
DOB
0 03-07-2019
1 03-08-2019
2 03-09-2019
3 03-10-2019
Be careful!
The returning object is NOT a dataframe — it is an object of the class Styler
, so don't assign it back to df
:
Don't do this:
df = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")}) # Don't do this!
(Every dataframe has its Styler object accessible by its .style
property, and we changed this df.style
object, not the dataframe itself.)
Questions and Answers:
Q: Why your Styler object (or an expression returning it) used as the last command in a Jupyter notebook cell displays your (styled) table, and not the Styler object itself?
A: Because every Styler object has a callback method ._repr_html_()
which returns an HTML code for rendering your dataframe (as a nice HTML table).
Jupyter Notebook IDE calls this method automatically to render objects which have it.
Note:
You don't need the Jupyter notebook for styling (i.e., for nice outputting a dataframe without changing its data / data types).
A Styler object has a method render()
, too, if you want to obtain a string with the HTML code (e.g., for publishing your formatted dataframe on the Web, or simply present your table in the HTML format):
df_styler = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})
HTML_string = df_styler.render()
datetime
as a data structure to hold information on date and time has no format - it's just a data structure. Its content could be displayed in a certain way / "format". Or if you have strings that represent date/time, it can be expressed therein in a certain way / "format". – Abound__str__()
method. I'm just mentioning in case any newbies are confused. – Civilization01/26/2016
is NOT a general date format. It's US specific, and ambiguous if the day is <=12 (as it could also be UK dd/mm/yyyy). Stick with YYYY-MM-DD anywhere you can, anything else and you're heading for a world of pain. Only place that should not is the UI itself, when it needs to be displayed in a culture that is appropriate for the user. – Praedial