如何将时间序列DataFrame按Timestamp列升序排列?现有代码无效
问题原因
你的排序代码无效是因为Timestamp列存储的是字符串类型,而非日期时间类型。字符串排序采用字典序,和时间的 chronological 顺序并不一致。另外,你的数据中存在格式错误的时间戳(比如10.26-22 10.06 AM里的日期部分用了点号而非连字符),这也会干扰正确的解析和排序。
解决步骤
要实现正确的时间排序,需要先将字符串格式的时间戳转换为datetime类型,再进行排序。具体步骤如下:
- 清理时间戳格式:修复日期部分的标点错误(把点号替换成连字符)。
- 转换为日期时间类型:使用
pandas.to_datetime将字符串解析为datetime对象。 - 按时间排序:基于转换后的日期时间列进行升序排序。
- 可选:恢复原字符串格式:如果需要将排序后的日期时间转回原字符串格式,可以使用
dt.strftime。
完整代码示例
import pandas as pd # 模拟你的DataFrame数据 data = { "Timestamp": [ "10-26-22 10.00 AM", "10-26-22 09.04 AM", "10.26-22 10.06 AM", "10-27-22 3.32 AM", "10-27-22 3.36 PM", "10-27-22 3.31 PM", "10-27-22 3.37 AM", "10-28-22 4.20 AM" ], "Values": [1, 5, 6, 9, 5, 8, 8.23, 7.2] } df = pd.DataFrame(data) # 1. 清理时间戳格式:替换日期部分的点号为连字符 df["Timestamp"] = df["Timestamp"].str.replace(r"(\d{2})\.(\d{2})-(\d{2})", r"\1-\2-\3", regex=True) # 2. 转换为datetime类型,指定格式匹配你的时间字符串 df["Timestamp"] = pd.to_datetime(df["Timestamp"], format="%m-%d-%y %I.%M %p") # 3. 按时间升序排序 df.sort_values("Timestamp", ascending=True, inplace=True) # 4. 可选:转回原字符串格式(保留前导零,如09.04 AM) df["Timestamp"] = df["Timestamp"].dt.strftime("%m-%d-%y %I.%M %p") print(df)
排序后输出
Timestamp Values 1 10-26-22 09.04 AM 5.0 0 10-26-22 10.00 AM 1.0 2 10-26-22 10.06 AM 6.0 3 10-27-22 03.32 AM 9.0 6 10-27-22 03.37 AM 8.23 5 10-27-22 03.31 PM 8.0 4 10-27-22 03.36 PM 5.0 7 10-28-22 04.20 AM 7.2
注意事项
- 如果你的DataFrame中包含
--------这样的分隔行,需要先过滤掉这些行再处理,处理完成后可以根据需求重新插入分隔行。 format参数的格式字符串要严格匹配你的时间戳格式:%m是两位月份,%d是两位日期,%y是两位年份,%I是12小时制的小时,%M是分钟,%p是AM/PM标识。
内容的提问来源于stack exchange,提问作者Nilay
相关产品推荐
相关产品推荐

