【问题标题】:How to select dataframe rows between two datetimes?如何在两个日期时间之间选择数据框行?
【发布时间】:2018-10-31 17:52:58
【问题描述】:

我无法从具有 CSV 文件中日期时间列的数据框中选择行。我有我的代码和我的示例数据。没有返回行。

import pandas as pd
import numpy as np
col_names = ['date','msft','nok','aapl','ibm','amzn']
stockprices = pd.read_csv('./stockdata.csv', skiprows=1, names=col_names)
stockprices.loc['2018-01-01 9:00:00':'2018-01-01 11:00:00']

CSV 文件数据:

        date               msft   nok   aapl   ibm  amzn 
    2018-01-01 08:00:00     107     2   161    140  1295
    2018-01-01 09:00:00     112     1   143    130  1298 
    2018-01-01 10:00:00     109    10   185    137  1647 
    2018-01-01 11:00:00      98    11   146    105  1331
    2018-01-01 12:00:00      83    3    214    131  1355

基本上,尝试在数据框中选择时间为 9:00:00、10:00:00 和 11:00:00 的 3 行。

使用 .loc 是最好的方法吗?

谢谢。

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    如果您有多个日期

    您可以通过convertingDateTimefilter 获得它

    df["date"]=pd.to_datetime(df["date"])
    df[df["date"].between('2018-01-01 09:00:00','2018-01-01 11:00:00')]
    

    【讨论】:

    • 谢谢大家,这一切我都很棒!我希望我能给你所有的分数!
    【解决方案2】:

    pd.date_range

    i = pd.date_range('2018-01-01 09:00:00', periods=3, freq='1H')
    
    # Result
    DatetimeIndex(['2018-01-01 09:00:00', '2018-01-01 10:00:00',
               '2018-01-01 11:00:00'],
              dtype='datetime64[ns]', freq='H')
    

    to_datetime

    df['date'] = pd.to_datetime(df.date)
    

    loc

    df.loc[(df.date >= i[0]) & (df.date <= i[-1])]
    
                     date  msft  nok  aapl  ibm  amzn
    1 2018-01-01 09:00:00   112    1   143  130  1298
    2 2018-01-01 10:00:00   109   10   185  137  1647
    3 2018-01-01 11:00:00    98   11   146  105  1331
    

    【讨论】:

    • 抱歉,我不太了解您的解决方案。看起来有 3 种不同的方法可以做到这一点。 loc 方法看起来像您正在使用索引?你能解释一下你的方法吗?
    • 这是我用来解决问题的三个步骤。首先,创建一个日期范围,然后将您的列转换为日期时间,然后使用loc
    • 谢谢你说得通。
    • 我有 pandas 日期时间列和另外两个从另一个数据帧获得的开始和结束日期时间。我正在使用此方法,但出现此错误:Can only compare identically-labeled Series objects
    【解决方案3】:

    试试这个,

    df['date']=pd.to_datetime(df['date'])
    df[df['date'].dt.hour.between(9,11)]
    

    输出:

                     date  msft  nok  aapl  ibm  amzn 
    1 2018-01-01 09:00:00   112    1   143  130   1298
    2 2018-01-01 10:00:00   109   10   185  137   1647
    3 2018-01-01 11:00:00    98   11   146  105   1331
    

    使用 betweenhour 来分割您想要的数据帧。

    【讨论】:

      【解决方案4】:

      df.loc 用于基于标签的行过滤。当您的数据框具有可用于过滤的标签时,或者默认情况下它从 0 到 n 开始。

      dt_range = pd.date_range('2018-01-01 09:00:00', periods=3, freq='1H')
      stockprices['dt'] = pd.to_datetime(stockprices['date'])
      
      result = stockprices[stockprices['dt'].apply(lambda x: dt_range[0] <= x  and  dt_range[len(dt_range)-1] >= x)]
      print("result df" , result )
      

      【讨论】:

        猜你喜欢
        • 2020-04-29
        • 2021-12-14
        • 1970-01-01
        • 2017-03-07
        • 2017-01-17
        • 2012-10-31
        • 2012-03-03
        • 2017-11-16
        • 1970-01-01
        相关资源
        最近更新 更多