【问题标题】:Sort by (unstructured) dates in Pandas DataFrame在 Pandas DataFrame 中按(非结构化)日期排序
【发布时间】:2017-01-19 18:44:22
【问题描述】:

我有一个包含以下数据的 Excel 表格

请注意,我有一个单独的列,其中日期、月份和时间以下列格式给出。

我希望根据日期和时间(即 Jan-1-1.0、Jan-2-2.0、Jan-1-3.0)对行进行排序,并在 Python Pandas DataFrame 中寻找方法。 (日期为法语)

请提供您的建议。

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

感谢您的及时回复。在我的excel中,单元格是日期。当我作为 DataFrame 加载时,它会显示一个数据类型为

pandas.core.series.Series

我只是无法解决。另请注意,我也有时间在同一个牢房里。

在此处向您展示所有 dtypes,如下所示;

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

谢谢。

【问题讨论】:

  • 你能展示当你把它加载到一个df中会发生什么吗? dtype 应该使用 pd.read_excel 正确嗅探到 datetime 所以它应该是可排序的,除非这些真的是字符串
  • 感谢您的及时回复。在我的excel中,单元格是日期。当我作为 DataFrame 加载时,它向我显示了 pandas.core.series.Series 的数据类型
  • df.dtypes 显示的新信息编辑您的问题?
  • 我刚刚在 EdChum 中添加了输出。谢谢。
  • 看起来你的日期实际上是字符串,我不知道小时组件是否会抛出它,但你可以使用 dateparser 模块来解析字符串:stackoverflow.com/questions/26294333/… 所以在导入后尝试df['Date_heure'].apply(dateparser.parse)

标签: python python-2.7 sorting pandas dataframe


【解决方案1】:

好的,你可以使用dateparser 来解析你的字符串,然后构造一个 TimedeltaIndex 来添加小时组件:

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

所以这个:

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')

是您应该感兴趣的行,在这里我将您的字符串上的apply 称为apply dateparser.parse 但这只会给您日期,因为它不了解浮点值,所以我然后@987654328 @字符串获取小时并转换为float,然后构造一个timedeltaindex。

之后我可以使用sort_values 对df进行排序:

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

【讨论】:

  • 亲爱的 EdChum, 非常感谢您为帮助我所做的努力。现在我可以按照我的意愿对数据进行排序。再次感谢您的时间和努力。他们准时帮助了我。
猜你喜欢
  • 2020-12-06
  • 2018-09-21
  • 1970-01-01
  • 2014-05-18
  • 2022-08-11
  • 1970-01-01
相关资源
最近更新 更多