Sort by (unstructured) dates in Pandas DataFrame
<p>I have an Excel table with the following data</p>

<p>Please note that I have a single column where the date, month, and time are given in the following format.</p>

<p>I wish to sort out the rows with respect to the date and time (i.e Jan-1-1.0, Jan-2-2.0, Jan-1-3.0) and looking for ways to do in Python Pandas DataFrame. (dates are in French)</p>

<p>Kindly provide your suggestions.</p>

<pre><code>Date-heure

Vendredi 03 novembre 10.0
Vendredi 03 novembre 5.0
Vendredi 03 novembre 18.0
Vendredi 03 novembre 24.0
Samedi 04 novembre 1.0
Samedi 04 novembre 2.0
Samedi 04 novembre 4.0
Samedi 04 novembre 5.0
Samedi 04 novembre 7.0
Samedi 04 novembre 13.0
Samedi 04 novembre 21.0
Vendredi 20 avril 1.0
Dimanche 05 novembre 2.0
Dimanche 05 novembre 8.0
</code></pre>

<p>Thank you for your prompt response. In my excel the cell is of Date. And when I loaded as a DataFrame, it shows me a datatype as</p>

<pre><code>pandas.core.series.Series
</code></pre>

<p>And I just could not sort it out. Also please note I have a time as well in the same cell. </p>

<p>Presenting you all the dtypes here as below;</p>

<pre><code>Date_heure                                                      object
Heure                                                            int64
Industrie (MW)                                                   int64
Tertiaire Chauffage (MW)                                         int64
Tertiaire Climatisation (MW)                                     int64
Tertiaire Autres usages (MW)                                     int64
RÃ©sidentiel Chauffage (MW)                                       int64
RÃ©sidentiel Eau chaude (MW)                                      int64
dtype: object
</code></pre>

<p>Thank you.</p>

<p>OK you can use <a href="https://pypi.python.org/pypi/dateparser" rel="nofollow"><code>dateparser</code></a> to parse your strings and then construct a TimedeltaIndex to add the hour component:</p>

<pre><code>In [36]:
import dateparser
t="""Date-heure
Vendredi 03 novembre 10.0
Vendredi 03 novembre 5.0
Vendredi 03 novembre 18.0
Vendredi 03 novembre 24.0
Samedi 04 novembre 1.0
Samedi 04 novembre 2.0
Samedi 04 novembre 4.0
Samedi 04 novembre 5.0
Samedi 04 novembre 7.0
Samedi 04 novembre 13.0
Samedi 04 novembre 21.0
Vendredi 20 avril 1.0
Dimanche 05 novembre 2.0
Dimanche 05 novembre 8.0"""
df = pd.read_csv(io.StringIO(t))
df['date-time'] = df['Date-heure'].str.split().str[:-1].str.join(' ').apply(dateparser.parse) + pd.TimedeltaIndex((df['Date-heure'].str.rsplit().str[-1]).astype(float), unit='H')
df

Out[36]:
                   Date-heure           date-time
0   Vendredi 03 novembre 10.0 2016-11-03 10:00:00
1    Vendredi 03 novembre 5.0 2016-11-03 05:00:00
2   Vendredi 03 novembre 18.0 2016-11-03 18:00:00
3   Vendredi 03 novembre 24.0 2016-11-04 00:00:00
4      Samedi 04 novembre 1.0 2016-11-04 01:00:00
5      Samedi 04 novembre 2.0 2016-11-04 02:00:00
6      Samedi 04 novembre 4.0 2016-11-04 04:00:00
7      Samedi 04 novembre 5.0 2016-11-04 05:00:00
8      Samedi 04 novembre 7.0 2016-11-04 07:00:00
9     Samedi 04 novembre 13.0 2016-11-04 13:00:00
10    Samedi 04 novembre 21.0 2016-11-04 21:00:00
11      Vendredi 20 avril 1.0 2016-04-20 01:00:00
12   Dimanche 05 novembre 2.0 2016-11-05 02:00:00
13   Dimanche 05 novembre 8.0 2016-11-05 08:00:00
</code></pre>

<p>So this:</p>

<pre><code>df['Date-heure'].str.split().str[:-1].str.join(' ').apply(dateparser.parse) + pd.TimedeltaIndex((df['Date-heure'].str.rsplit().str[-1]).astype(float), unit='H')
</code></pre>

<p>is the line that should interest you, here I call <code>apply</code> on your strings to <code>apply</code> <code>dateparser.parse</code> but this will only give you the date as it doesn't understand the float value, so I then <code>rsplit</code> the string to get the hour and cast to float and then construct a timedeltaindex.</p>

<p>After which I can use <code>sort_values</code> to sort the df:</p>

<pre><code>In [37]:
df.sort_values('date-time')

Out[37]:
                   Date-heure           date-time
11      Vendredi 20 avril 1.0 2016-04-20 01:00:00
1    Vendredi 03 novembre 5.0 2016-11-03 05:00:00
0   Vendredi 03 novembre 10.0 2016-11-03 10:00:00
2   Vendredi 03 novembre 18.0 2016-11-03 18:00:00
3   Vendredi 03 novembre 24.0 2016-11-04 00:00:00
4      Samedi 04 novembre 1.0 2016-11-04 01:00:00
5      Samedi 04 novembre 2.0 2016-11-04 02:00:00
6      Samedi 04 novembre 4.0 2016-11-04 04:00:00
7      Samedi 04 novembre 5.0 2016-11-04 05:00:00
8      Samedi 04 novembre 7.0 2016-11-04 07:00:00
9     Samedi 04 novembre 13.0 2016-11-04 13:00:00
10    Samedi 04 novembre 21.0 2016-11-04 21:00:00
12   Dimanche 05 novembre 2.0 2016-11-05 02:00:00
13   Dimanche 05 novembre 8.0 2016-11-05 08:00:00
</code></pre>

python python-2.7 sorting pandas dataframe