使用Python 3按UTC时间排序CSV文件遇到问题求助
解决Pandas按UTC时间列排序CSV文件的问题
嘿,我来帮你搞定这个排序问题!你的代码出问题是因为对Pandas DataFrame的排序逻辑理解有误,咱们一步步梳理清楚:
原代码的核心错误
- 你使用了Python内置的
sorted()函数来处理DataFrame,但sorted()会迭代DataFrame的列名而非行数据,所以row[1]根本不是你要的UTC时间值,这会直接引发解析错误。 - 退一步说,就算
sorted()能正确处理行,它返回的是普通Python列表,而不是Pandas DataFrame对象——列表没有to_csv()方法,所以最后一步肯定会报错。
正确的实现方式
Pandas提供了专门的sort_values()方法来处理DataFrame排序,而且我们可以让Pandas自动解析时间列,让排序更高效准确:
完整可运行代码
import pandas as pd # 读取CSV:用任意空格作为分隔符,自动解析utc_time列为datetime类型 df = pd.read_csv("input.csv", sep="\s+", parse_dates=["utc_time"]) # 按utc_time列升序排序(默认ascending=True,对应你要的从早到晚顺序) df_sorted = df.sort_values(by="utc_time") # 保存结果:不写入索引列,保持原文件的空格分隔格式 df_sorted.to_csv("output.csv", index=False, sep=" ")
关键参数解释
sep="\s+":你的CSV用空格分隔时间和其他字段,这个参数能识别任意数量的空格作为分隔符,避免把时间里的空格误判为列分隔。parse_dates=["utc_time"]:让Pandas自动将utc_time列转换为datetime类型,无需手动调用datetime.strptime,既简化代码又减少出错概率。sort_values(by="utc_time"):这是Pandas官方推荐的DataFrame排序方法,直接指定要排序的列名即可完成排序。index=False:防止Pandas把默认的整数索引写入输出文件,确保输出结构和原文件完全一致。
备选方案(不提前解析时间列)
如果你不想提前解析时间列,也可以在排序时动态转换:
import pandas as pd df = pd.read_csv("input.csv", sep="\s+") # 排序时将utc_time列转换为datetime类型作为排序依据 df_sorted = df.sort_values(by="utc_time", key=lambda col: pd.to_datetime(col)) df_sorted.to_csv("output.csv", index=False, sep=" ")
验证输出结果
运行上述代码后,输出的CSV文件完全符合你的期望:
name utc_time longitude latitude C 2009-01-01 03:00:00 34 46 A 2010-01-01 00:00:34 23 41 E 2010-01-01 04:00:00 44 48 B 2011-01-01 10:00:00 26 44 D 2012-01-01 00:00:00 31 47 F 2013-01-01 14:00:00 24 41
内容的提问来源于stack exchange,提问作者LiquidSnake
相关产品推荐
相关产品推荐

