【问题标题】:Python not able to compare the dates in dateframes [duplicate]Python无法比较日期框中的日期[重复]
【发布时间】:2019-01-05 21:02:38
【问题描述】:

我有一个数据框 df['Latest date'] 如下

45      01.12.2015 - 13:35:23
46      01.12.2015 - 13:36:27
                ...          
4355    09.07.2018 - 07:54:22
4356    09.07.2018 - 07:52:03
4357    24.07.2018 - 16:00:36
4358    09.07.2018 - 07:53:19
4359    09.07.2018 - 11:40:22
4369    23.07.2018 - 09:13:34
4370    16.07.2018 - 13:02:28
4371    23.07.2018 - 09:14:13
4372    23.07.2018 - 09:14:44
4374    23.07.2018 - 09:15:35
4378    23.07.2018 - 09:15:58
4379    23.07.2018 - 09:16:24
4380    23.07.2018 - 09:16:41
4381    23.07.2018 - 09:17:16
4383    23.07.2018 - 09:17:53
4387    23.07.2018 - 09:18:28
4389    23.07.2018 - 09:19:25
4393    23.07.2018 - 09:20:08
4394    25.07.2018 - 14:25:20
4395    18.07.2018 - 10:10:58
4396    18.07.2018 - 10:10:18
4398    18.07.2018 - 10:10:42
4399    16.07.2018 - 11:09:21
4400    16.07.2018 - 11:27:23
4401    23.07.2018 - 09:21:16
4407    18.07.2018 - 10:11:15
4417    24.07.2018 - 11:56:14
4418    25.07.2018 - 11:05:11

我想过滤日期> 22/07/2018 的行

我试过df=df[(df["Latest date"]>"22/07/2018")]

但是,新的 df 不一定会在 22/07/2018 之后返回条目。我想知道它是否不理解日期是“dd/mm/yy”格式。

【问题讨论】:

  • 您需要使用date 对象,而不是字符串。现在您执行序数比较,这意味着 23/06/1984 被视为更大。

标签: python pandas datetime


【解决方案1】:

您需要首先使用 to_datetime 使用参数 format 将日期解析为 datetimes,如果格式不同,另请参阅 http://strftime.org/

df["Latest date"] = pd.to_datetime(df["Latest date"], format='%d.%m.%Y - %H:%M:%S')
#slowier solution without defined format
#df["Latest date"] = pd.to_datetime(df["Latest date"])

print (df["Latest date"].dtype)
datetime64[ns]

[30000 rows x 1 columns]
df = pd.concat([df] * 1000, ignore_index=True)

In [204]: %timeit df["Latest date1"] = pd.to_datetime(df["Latest date"], format='%d.%m.%Y - %H:%M:%S')
163 ms ± 3.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [205]: %timeit df["Latest date2"] = pd.to_datetime(df["Latest date"])
5.09 s ± 55.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

所以现在可以过滤了:

df=df[(df["Latest date"]>"22/07/2018")]
print (df)
             Latest date
4357 2018-07-24 16:00:36
4369 2018-07-23 09:13:34
4371 2018-07-23 09:14:13
4372 2018-07-23 09:14:44
4374 2018-07-23 09:15:35
4378 2018-07-23 09:15:58
4379 2018-07-23 09:16:24
4380 2018-07-23 09:16:41
4381 2018-07-23 09:17:16
4383 2018-07-23 09:17:53
4387 2018-07-23 09:18:28
4389 2018-07-23 09:19:25
4393 2018-07-23 09:20:08
4394 2018-07-25 14:25:20
4401 2018-07-23 09:21:16
4417 2018-07-24 11:56:14
4418 2018-07-25 11:05:11

编辑:

如果输入数据在csv 中,另一种可能的解决方案是按列位置或按列名称使用parse_dates 参数:

df = pd.read_csv(file, parse_dates=['Latest date']) 
#e.g. third column, pandas counts from 0
#df = pd.read_csv(file, parse_dates=[2]) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2011-02-14
    • 2014-05-15
    • 1970-01-01
    相关资源
    最近更新 更多