使用Pandas过滤和比较日期

时间:2017-05-24 15:23:10

标签: pandas datetime

我想知道如何在所有不同的时间级别过滤不同的日期,即按年,月,日,小时,分钟和/或日查找日期。例如,如何查找2014年或2014年1月或2014年1月2日发生的所有日期或......到第二个?

所以我有 pd.to_datetime 生成的日期和时间数据框

    timeStamp
0   2014-01-02 21:03:04
1   2014-02-02 21:03:05

因此,如果我在2014年过滤,那么我会得到输出:

    timeStamp
0   2014-01-02 21:03:04
1   2014-02-02 21:03:05

或者作为一个不同的例子,我想知道2014年和每个月的第二天发生的日期。这也会导致:

    timeStamp
0   2014-01-02 21:03:04

但如果我要求在2014年1月2日发生日期

{{1}}

如何在所有不同级别实现这一目标?

另外,如何比较这些不同级别的日期以创建布尔索引数组?

3 个答案:

答案 0 :(得分:7)

您可以通过布尔索引过滤数据帧,如下所示:

df.loc[df['timeStamp'].dt.year == 2014]
df.loc[df['timeStamp'].dt.month == 5]
df.loc[df['timeStamp'].dt.second == 4]
df.loc[df['timeStamp'] == '2014-01-02']
df.loc[pd.to_datetime(df['timeStamp'].dt.date) == '2014-01-02']

......依此类推。

答案 1 :(得分:1)

如果将timestamp设置为index并将dtype设置为datetime以获取DateTimeIndex,则可以使用以下Partial String Indexing语法:

df['2014'] # gets all 2014
df['2014-01'] # gets all Jan 2014
df['01-02-2014'] # gets all Jan 2, 2014

答案 2 :(得分:1)

我只想创建一个字符串系列,然后使用带有通配符的str.contains()。这将为您提供您正在寻找的任何粒度。

data

输出:

s = df['timeStamp'].map(lambda x: x.strftime('%Y-%m-%d %H:%M:%S'))

print(df[s.str.contains('2014-..-.. ..:..:..')])
print(df[s.str.contains('2014-..-02 ..:..:..')])
print(df[s.str.contains('....-02-.. ..:..:..')])
print(df[s.str.contains('....-..-.. 18:03:10')])

我认为这也解决了你关于布尔索引的问题:

        timeStamp
0 2014-01-02 21:03:04
1 2014-02-02 21:03:05
        timeStamp
0 2014-01-02 21:03:04
1 2014-02-02 21:03:05
        timeStamp
1 2014-02-02 21:03:05
2 2016-02-04 18:03:10
        timeStamp
2 2016-02-04 18:03:10

输出:

print(s.str.contains('....-..-.. 18:03:10'))