Pandas对DateTime列的错误排序[重复]

Posted

技术标签:

【中文标题】Pandas对DateTime列的错误排序[重复]【英文标题】:Pandas wrong sorting of DateTime column [duplicate] 【发布时间】:2019-07-06 01:45:00 【问题描述】:

我有一个 Pandas DataFrame df,其中包含一个 DateTime 列('DateTime')和一个带有数值的列('load')。 我想根据 DateTime 对 DataFrame 进行排序。

因此我使用了以下代码:

df.sort_values('DateTime')

但是,排序显然不正确(我确实有一年中每个小时的条目)。

    DateTime             load
0   2017-01-04 00:00:00 52223.4500
1   2017-01-04 01:00:00 51392.4225
2   2017-01-04 02:00:00 51523.6875
3   2017-01-04 03:00:00 52356.4525
4   2017-01-04 04:00:00 54685.1125
5   2017-01-04 05:00:00 60150.9925
6   2017-01-04 06:00:00 66820.7375
7   2017-01-04 07:00:00 70047.9175
8   2017-01-04 08:00:00 71457.6350
9   2017-01-04 09:00:00 72288.9975
10  2017-01-04 10:00:00 73059.6850
11  2017-01-04 11:00:00 72965.4000
12  2017-01-04 12:00:00 71860.8625
13  2017-01-04 13:00:00 70186.3825
14  2017-01-04 14:00:00 69362.5425
15  2017-01-04 15:00:00 70146.8800
16  2017-01-04 16:00:00 71641.2275
17  2017-01-04 17:00:00 70686.6700
18  2017-01-04 18:00:00 69214.0275
19  2017-01-04 19:00:00 65552.7600
20  2017-01-04 20:00:00 62177.0875
21  2017-01-04 21:00:00 60257.1750
22  2017-01-04 22:00:00 56170.3500
23  2017-01-04 23:00:00 52265.3050
24  2017-01-15 00:00:00 46725.7725
25  2017-01-15 01:00:00 45447.4650
26  2017-01-15 02:00:00 44887.1600
27  2017-01-15 03:00:00 44230.0025
28  2017-01-15 04:00:00 43838.2300
29  2017-01-15 05:00:00 42747.1475
... ... ...
8730    2017-12-28 02:00:00 40675.2025
8731    2017-12-28 03:00:00 42022.7050
8732    2017-12-28 04:00:00 44010.7025
8733    2017-12-28 05:00:00 46842.8875
8734    2017-12-28 06:00:00 51119.2625
8735    2017-12-28 07:00:00 55059.5600
8736    2017-12-28 08:00:00 58077.6375
8737    2017-12-28 09:00:00 59538.5075
8738    2017-12-28 10:00:00 60753.6975
8739    2017-12-28 11:00:00 60720.7275
8740    2017-12-28 13:00:00 58208.7925
8741    2017-12-28 12:00:00 59299.2325
8742    2017-12-28 15:00:00 58370.4075
8743    2017-12-28 16:00:00 61120.1675
8744    2017-12-28 17:00:00 61194.5025
8745    2017-12-28 18:00:00 59644.1900
8746    2017-12-28 19:00:00 56113.4500
8747    2017-12-28 20:00:00 53672.4725
8748    2017-12-28 21:00:00 52312.3350
8749    2017-12-28 22:00:00 48750.4325
8750    2017-12-28 23:00:00 45816.2225
8751    2017-12-29 00:00:00 43684.6650
8752    2017-12-29 01:00:00 42797.5800
8753    2017-12-29 02:00:00 42608.9925
8754    2017-12-29 03:00:00 43510.8925
8755    2017-12-29 04:00:00 44424.2175
8756    2017-12-29 05:00:00 46470.2750
8757    2017-12-29 06:00:00 50801.7100
8758    2017-12-29 07:00:00 54854.4375
8759    2017-12-29 08:00:00 56226.2575

我认为这些列的数据类型正确:

df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8760 entries, 0 to 8759
Data columns (total 2 columns):
DateTime    8760 non-null datetime64[ns]
load        8760 non-null float64
dtypes: datetime64[ns](1), float64(1)
memory usage: 136.9 KB

如果我在 DateTime 列中搜索最小值或最大值,我会找到正确的条目。只有排序似乎不起作用。我可以尝试什么?

df.loc[df['DateTime'].idxmax()]

DateTime    2017-12-31 23:00:00
load                    43802.8
Name: 8706, dtype: object



df.loc[df['DateTime'].idxmin()]

DateTime    2017-01-01 00:00:00
load                    43202.4
Name: 48, dtype: object

【问题讨论】:

这在我看来是排序的,有没有没有排序的地方? 它以 2017-01-04 开始,以 2017-12-29 结束,但正如 min/max 代码所示,也有 2017-01-01 和 2017-12-31 的记录. 您确定这不是作业问题吗?试试df = df.sort_values('DateTime')(或df.sort_values('DateTime', inplace=True) 谢谢@JoshFriedlander!这很有效,很容易。但是,我不太明白,为什么没有直接赋值的排序不起作用? 不确定 - 您粘贴的输出是排序调用的直接结果吗?如果没有,Pandas 不会更改 df 本身 【参考方案1】:

(将我的评论变成@Wai Ha Lee 建议的答案)

df.sort_values('DateTime') 返回数据帧的排序副本,但不会更改原始数据。

这可以通过显式重新分配来完成:

df = df.sort_values('DateTime')

或使用inplace 标志

df.sort_values('DateTime', inplace=True)

尽管不鼓励后者并计划弃用后者。

【讨论】:

以上是关于Pandas对DateTime列的错误排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

对具有重复列的多行求和 pandas [重复]

如何在 Pandas 中转换 datetime 列的时区?

对 Pandas 中各列的多行值求和 [重复]

更改 pandas datetime64 列的时间组件

pandas计算dataframe结束时间列和起始时间列的时间差使用sort_values函数对dataframe数据基于时间差进行排序(设置使用倒序排序)

pandas计算dataframe结束时间列和起始时间列的时间差使用sort_values函数对dataframe数据基于时间差进行排序(默认为升序排序)