【问题标题】:Pandas DataFrame.loc returns Empty DataFramePandas DataFrame.loc 返回 Empty DataFrame
【发布时间】:2018-09-12 05:15:37
【问题描述】:

目前正在尝试完成一些教程。现在我有一个带有股票数据的熊猫数据框。通过读取 csv 文件获取股票数据,然后使用 df.set_index('timestamp', inplace = True) 我将索引设置为使用“时间戳”。在这里可以看到头部:

 timestamp   open   high    low   close  adjusted_close   volume  dividend_amount  split_coefficient
2018-09-11  74.95  75.69  74.76  75.64           75.64  2225700              0.0                1.0
2018-09-10  75.10  75.21  74.84  74.91           74.91  1774400              0.0                1.0
2018-09-07  75.20  75.20  74.72  75.01           75.01  1804800              0.0                1.0
2018-09-06  74.95  75.55  74.62  75.24           75.24  3058300              0.0                1.0
2018-09-05  75.03  75.42  74.80  74.95           74.95  2418400              0.0                1.0

当我尝试df.loc['2018-09-05'] 时,它会向我返回正确的行。但是,当我尝试选择一个范围时,例如 df.loc['2018-09-05':'2018-09-11'],我得到一个 Empty DataFrame 返回:

Empty DataFrame
Columns: [open, high, low, close, adjusted_close, volume, dividend_amount, 
split_coefficient]
Index: []

想知道是否有人可以提供任何关于为什么会发生这种情况的见解?我本来希望返回两个日期之间的信息而不是空数据框。谢谢!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    sort_index() 在切片之前工作:

    df = df.sort_index()
    df['2018-09-05':'2018-09-11']
    

    或

    df = df.sort_index()
    df.loc['2018-09-05':'2018-09-11']
    

    仅供参考:如果您想在将 'timestamp' 设为索引之前确保该索引为 DatetimeIndex:

    df.timestamp = pd.to_datetime(df.timestamp)
    df = df.set_index('timestamp')
    

    或事后:

    df.index = pd.to_datetime(df.index)
    

    【讨论】:

    • 还有一个想法——如果不是DatetimeIndex,也许df.index = pd.to_datetime(df.index) ;)
    • @jezrael - 谢谢。即使df.loc['2018-09-05'] 工作,而df.loc['2018-09-05':'2018-09-11'] 没有转换为 DatetimeIndex,这可能也是正确的。我会在这里尝试测试,如果是这样,我会编辑它。
    • 完全一样的想法 - 如果不匹配,另一个可能的问题;)
    • @jezrael 原来df.timestamp = pd.to_datetime(df.timestamp) 然后df = df.set_index('timestamp') 是上述解决方案的工作方式。如果df = df.set_index('timestamp') 然后df = pd.to_datetime(df.index) 则上面的代码不起作用,因为DatetimeIndex 不接受loc 或sort_index。我不知道。
    • 有错字,需要df.index = pd.to_datetime(df.index)而不是df = pd.to_datetime(df.index)
    【解决方案2】:

    因为您需要从上到下正确插入索引。 试试这个特定的索引:

    df.loc['2018-09-11':'2018-09-05']
    

    但您可以使用sort() 对索引进行排序。
    您也可以为此使用 ID。

    【讨论】:

      【解决方案3】:

      如果timestamp 列是 Pandas 时间戳,你可以这样做。

      mask = (df['timestamp'] >= pd.Timestamp('2018-09-05')) & (df['timestamp'] <= pd.Timestamp('2018-09-11'))
      
      df.loc[mask, :]
      

      【讨论】:

        【解决方案4】:

        您只需将日期从新到旧颠倒即可。

        import pandas as pd
        df = pd.read_csv('some.csv', delimiter=";", index_col='timestamp')
        range = df.loc['2018-09-11':'2018-09-05']
        print(range)
        

        【讨论】:

          【解决方案5】:

          如果你更改日期格式,它会起作用

          df.loc['05/09/2018': '11/09/2018']
          

          【讨论】:

          • 虽然这可能会回答作者的问题,但它缺少一些解释性文字和文档链接。如果没有围绕它的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请编辑您的答案。
          猜你喜欢
          • 1970-01-01
          • 2014-06-17
          • 2018-08-14
          • 2018-08-01
          • 1970-01-01
          • 2019-08-29
          • 2016-08-04
          • 2023-03-15
          • 1970-01-01
          相关资源
          最近更新 更多