【问题标题】:Select data in pandas from multiple specific date从多个特定日期选择 pandas 中的数据
【发布时间】:2018-10-30 22:59:30
【问题描述】:
dft = pd.DataFrame(randn(100000,1), columns=['A'],
     index=pd.date_range('20130101',periods=100000,freq='T'))

如您所见,我以 10 分钟的间隔将日期帧从“2013-01-01”初始化为“2013-03-11”。如何从特定条件中选择特定数据?

1) 列表中的日期 eg: 如果有一个列表 ['2013-01-02', '2013-01-04', '2013-01-06'] 如何选择此列表日期的数据?或者如何选择不在此列表日期上的数据? 更具体地说,“2013-01-02”是指从“2013-01-02 00:00:00”到“2013-01-02 23:50:00”的所有数据。

2) 多个切片选择 例如:我希望我可以选择多个切片中的数据,如下所示: ['2013-01-02':'2013-01-03'] & ['2013-01-05':'2013-01-07'] & ['2013-01-09':'2013-01- 11'] 具体来说,这个 slice 应该和 python slice 一样,意思是包含左不包含右。

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    假设这是原始数据(带有Datetime 索引)

    dft = pd.DataFrame(np.random.randn(100000,1), columns=['A'],
         index=pd.date_range('20130101',periods=100000,freq='T'))
    dft.head()
                                A
    2013-01-01 00:00:00  0.313644
    2013-01-01 00:01:00  0.458860
    2013-01-01 00:02:00  0.841434
    2013-01-01 00:03:00 -0.135846
    2013-01-01 00:04:00 -0.881316
    

    对于 1),只需使用 .isin()

    myDates = ['2013-01-02', '2013-01-04', '2013-01-06']
    
    # to get data in list
    df_in = dft[pd.to_datetime(dft.index.date).isin(myDates)]
    df_in.head()
                                A
    2013-01-02 00:00:00  0.444005
    2013-01-02 00:01:00 -0.073561
    2013-01-02 00:02:00  0.256737
    2013-01-02 00:03:00  1.304807
    2013-01-02 00:04:00 -0.741956
    
    # to get data not in list
    df_not_in = dft[~pd.to_datetime(dft.index.date).isin(myDates)]
    df_not_in_list.head()
                                A
    2013-01-01 00:00:00 -0.944070
    2013-01-01 00:01:00  0.225456
    2013-01-01 00:02:00  0.571424
    2013-01-01 00:03:00 -0.004389
    2013-01-01 00:04:00  0.933229
    

    对于 2),如果我理解正确,您想使用多个日期时间片选择数据。为此,您可以使用嵌套列表中的multiple index masks 按日期过滤

    myDates = [['2013-01-02','2013-01-03'],
               ['2013-01-05','2013-01-07'],
               ['2013-01-09','2013-01-11']]
    df_masked = dft[
          (dft.index >= myDates[0][0]) & (dft.index <= myDates[0][1]) & \
          (dft.index >= myDates[1][0]) & (dft.index <= myDates[1][1]) & \
          (dft.index >= myDates[2][0]) & (dft.index <= myDates[2][1])
          ]
    

    【讨论】:

    • 您好 WR,我在发布问题之前已经测试了这种方法。它没有用。
    • 这很奇怪。我使用了您发布的相同示例数据并且它有效。您的样本数据有一个Datetime 索引。检查您的真实数据是否也具有与示例数据格式相同的Datetime 索引。这可能是问题的一部分......
    • 另外,如果您已经尝试过,您应该发布您的工作并显示问题/错误消息。
    • 对于 1) 它只返回 2013-01-02 00:00:00, 2013-01-04 00:00:00, 2013-01-06 00:00:00 数据。对不起,我没有说清楚。我希望我能得到 2013-01-02、2013-01-04 和 2013-01-06 的所有数据。
    • 对于 2),这个解决方案就是我想要的。谢谢。
    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 2016-12-10
    • 2020-06-11
    • 2023-03-10
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多