【问题标题】:Put a dataframe in chronological 'dd.mm.yyyy' order using pandas使用 pandas 按时间顺序“dd.mm.yyyy”放置数据框
【发布时间】:2020-03-31 17:53:40
【问题描述】:

我有一个包含几列的 csv 文件,其中一列包含dd.mm.yyyy 格式的日期。它的条目(行)不是按时间顺序排列的。我所做的是使用pd.to_datetime 转换这些值,然后是sort_values。 (代码如下)。

所需输出:01.09.2019, 02.09.2019, 03.09.2019, ...., 30.03.2020

但是,我得到:01.01.2020, 01.02.2020, 01.09.2019, 01.11.2019, ..., 31.12.2019

daten = pd.read_csv("gewichtstagebuch.csv", sep=";", decimal=",",
                usecols=("Datum","Gewicht (kg)"))
pd.to_datetime(daten['Datum'])
daten.sort_values(by="Datum", ascending= True)

我尝试了其他方法来对我的数据集进行排序或转换,但screenshot 然后 Python 假定月份为几天,反之亦然,因此我最终仍然会得到错误的结果(例如强制格式和 strftime)。

【问题讨论】:

  • 您是否尝试过使用 pd.to_datetime(daten['Datum'], dayfirst=True)?
  • to_datetime() 函数有一个参数(格式),您可以将要格式化的日期时间的格式传递给该参数,以便它知道如何解析。
  • pd.to_datetime 返回一个 datetime 因此它不会更新您的 daten 数据框。操作不是in_place
  • pd.read_csv()parse_dates 选项,并且您需要 dayfirst = True 用于 dd.mm.yyyy 格式。您可能需要infer_datetime_format = True 来处理点分隔符。一般来说,您不需要在读取 CSV 后在列上追溯运行 to_datetime() - 这会浪费大量内存来临时存储日期字符串。
  • @Matthew Borish:是的,我这样做了,它对日期的顺序没有影响。

标签: python pandas csv datetime-conversion


【解决方案1】:

在使用 pandas 读取数据时,您可以使用“parse_dates”参数,该参数会自动将字段转换为日期时间。

daten = pd.read_csv("prob_data.csv", sep=",", decimal=",", parse_dates=[0],
                usecols=("Datum","Gewicht (kg)"))

daten.sort_values(by="Datum", ascending= True)

在上面的代码中,我提到了parse_dates=[0],考虑到first (0) column 是日期列。一旦我们加载数据,它会自动将列转换为日期列。

现在,如果您运行代码对数据框进行排序,它将相应地对数据集进行排序。

希望这会有所帮助。

【讨论】:

  • 您好 Adrish,感谢您的帮助。我按照您的评论中的建议尝试了 parse_dates,但结果保持不变。我列表的第一项是 2019-01-09,然后是 2019-01-10,依此类推。对我来说,它似乎仍然假设 01 是 1 月,但实际上列表从 9 月开始。
【解决方案2】:

pd.to_datetime 返回一个datetime,因此不会更新您的daten 数据框。因此排序没有按预期工作。

尝试执行以下操作:

daten = pd.read_csv("gewichtstagebuch.csv", sep=";", decimal=",",
                usecols=("Datum","Gewicht (kg)"))
daten = daten.assign(Datum=lambda x: pd.to_datetime(x.Datum)) # this returns a new dataframe
daten.sort_values(by="Datum", ascending= True)

【讨论】:

  • 嗨,远方,此代码返回以下内容: 2019-01-09 2019-01-10 2019-01-11 2019-02-09 2019-02-10 ...所以不幸的是仍然没有时间顺序订购。
【解决方案3】:

对于那些有相同或相似问题的人 - smci 建议的这个解决方案解决了这个问题:

daten = pd.read_csv("gewichtstagebuch.csv", sep=";", decimal=",", parse_dates=[0],
                infer_datetime_format= True, dayfirst=True,
                usecols=("Datum","Gewicht (kg)"))
daten.sort_values(by="Datum", ascending= True)

所以 parse_dates、infer_datetime_format 和 dayfirst 的组合。现在我得到了想要的顺序:

2019-09-01
2019-09-02
2019-09-03
2019-09-04
...

【讨论】:

    猜你喜欢
    • 2018-11-12
    • 2019-03-20
    • 2019-09-29
    • 2022-01-08
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多