【问题标题】:How to select rows within a pandas dataframe based on time only when index is date and time仅当索引为日期和时间时,如何根据时间选择熊猫数据框中的行
【发布时间】:2012-10-24 15:30:20
【问题描述】:

我有一个如下所示的数据框:

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 2016910 entries, 2009-01-02 04:51:00 to 2012-11-02 20:00:00
Freq: T
Data columns:
X1    2016910  non-null values
X2    2016910  non-null values
X3    2016910  non-null values
X4    2016910  non-null values
X5    2016910  non-null values
dtypes: float64(5)

我想通过仅访问整个日期范围内的特定时间来“过滤”它。例如,我想返回一个数据框,其中包含时间在 13:00:00 到 14:00:00 之间的所有行,但包含所有日期。我正在从 CSV 文件中读取数据,并且日期时间是一列,但我可以很容易地使输入 CSV 文件包含单独的日期和时间。我尝试了单独的日期和时间路线,并创建了一个多索引,但是当我这样做时,我最终得到了两个索引列——其中一个包含正确的日期和不正确的时间,而不仅仅是一个日期,第二个包含一个不正确的日期,然后是一个正确的时间,而不仅仅是一个时间。我的多索引尝试的输入数据如下所示:

 20090102,04:51:00,89.9900,89.9900,89.9900,89.9900,100
 20090102,05:36:00,90.0100,90.0100,90.0100,90.0100,200
 20090102,05:44:00,90.1400,90.1400,90.1400,90.1400,100
 20090102,05:50:00,90.0500,90.0500,90.0500,90.0500,500
 20090102,05:56:00,90.1000,90.1000,90.1000,90.1000,300
 20090102,05:57:00,90.1000,90.1000,90.1000,90.1000,200

我尝试使用此代码阅读:

 singledf = pd.DataFrame.from_csv("inputfile",header=None,index_col=[0,1],parse_dates=True)

这导致了一个如下所示的数据框:

singledf.sort()
singledf

<class 'pandas.core.frame.DataFrame'>
MultiIndex: 716244 entries, (<Timestamp: 2009-01-02 00:00:00>, <Timestamp: 2012-11-04      04:51:00>) to (<Timestamp: 2012-11-02 00:00:00>, <Timestamp: 2012-11-04 20:00:00>)
Data columns:
X2    716244  non-null values
X3    716244  non-null values
X4    716244  non-null values
X5    716244  non-null values
X6    716244  non-null values
dtypes: float64(4), int64(1)

也许多索引方法是完全错误的,但这是我尝试过的一件事。似乎它坚持使用日期时间对象,并希望强制索引列具有日期时间,而不仅仅是日期或时间。我的非多索引尝试的源 CSV 文件如下所示:

20090102 04:51:00,89.9900,89.9900,89.9900,89.9900,100
20090102 05:36:00,90.0100,90.0100,90.0100,90.0100,200
20090102 05:44:00,90.1400,90.1400,90.1400,90.1400,100
20090102 05:50:00,90.0500,90.0500,90.0500,90.0500,500
20090102 05:56:00,90.1000,90.1000,90.1000,90.1000,300

我正在使用熊猫 .9。任何建议表示赞赏!

【问题讨论】:

    标签: dataframe pandas


    【解决方案1】:

    常规的 DatetimeIndex 允许使用 between_time 方法。

    In [12]: data = """\
     20090102,04:51:00,89.9900,89.9900,89.9900,89.9900,100
     20090102,05:36:00,90.0100,90.0100,90.0100,90.0100,200
     20090102,05:44:00,90.1400,90.1400,90.1400,90.1400,100
     20090102,05:50:00,90.0500,90.0500,90.0500,90.0500,500
     20090102,05:56:00,90.1000,90.1000,90.1000,90.1000,300
     20090102,05:57:00,90.1000,90.1000,90.1000,90.1000,200
    """
    
    In [13]: singledf = pd.DataFrame.from_csv(StringIO(data), header=None, parse_dates=[[0,1]])
    
    In [14]: singledf
    Out[14]:
                            X2     X3     X4     X5   X6
    X0_X1
    2009-01-02 04:51:00  89.99  89.99  89.99  89.99  100
    2009-01-02 05:36:00  90.01  90.01  90.01  90.01  200
    2009-01-02 05:44:00  90.14  90.14  90.14  90.14  100
    2009-01-02 05:50:00  90.05  90.05  90.05  90.05  500
    2009-01-02 05:56:00  90.10  90.10  90.10  90.10  300
    2009-01-02 05:57:00  90.10  90.10  90.10  90.10  200
    
    In [15]: singledf.between_time('5:30:00', '5:45:00')
    Out[15]:
                            X2     X3     X4     X5   X6
    X0_X1
    2009-01-02 05:36:00  90.01  90.01  90.01  90.01  200
    2009-01-02 05:44:00  90.14  90.14  90.14  90.14  100
    

    【讨论】:

    • 谢谢,Wouter。这看起来正是我正在寻找的。但是,当我运行最后一行时,我得到一个:“AttributeError: 'DataFrame' object has no attribute 'between_time'”错误。我正在运行 pandas 0.9.0,所以我认为我应该拥有它。你有什么想法?谢谢。
    • 啊,没关系,我从 github 拉了最新的 pandas,现在我有了 dataframe.between_time。看起来这将是 .10 的新内容,也许只有 TimeSeries 以前有它。现在我没有因为没有找到它而感到难过。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2021-12-14
    • 1970-01-01
    • 2017-02-08
    • 2021-10-26
    • 2021-03-19
    • 2019-02-11
    相关资源
    最近更新 更多