【问题标题】:Select rows between two DatetimeIndex dates选择两个 DatetimeIndex 日期之间的行
【发布时间】:2017-07-13 15:19:58
【问题描述】:

我有一个以下格式的 CSV 文件:

vm,time,LoadInt1
abc-webapp-02,2017-05-31 10:00:00,3.133333
abc-webapp-02,2017-05-31 10:05:00,0.000000
abc-webapp-02,2017-05-31 10:10:00,0.000000
abc-webapp-02,2017-05-31 10:15:00,0.000000
abc-webapp-02,2017-05-31 10:20:00,0.000000
abc-webapp-02,2017-05-31 10:25:00,0.000000
abc-webapp-02,2017-05-31 10:30:00,0.000000
abc-webapp-02,2017-05-31 10:35:00,0.000000
abc-webapp-02,2017-05-31 10:40:00,0.000000

我使用以下代码将 CSV 文件读入 DataFrame。日期被解析为索引(DatetimeIndex)

dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
df = pd.read_csv("my_file.csv", header=0, parse_dates=[1], index_col=1, date_parser=dateparse)

现在我正在尝试使用以下代码获取两个日期之间的所有行(真正的 CSV 文件在下面提到的日期之间有大量行):

df.loc['2017-05-30' : '2017-05-31']

请注意,建议使用上述方法here。但是,它不适合我。所以,这可能不是一个重复的问题。

【问题讨论】:

  • 你能显示df.head()的输出吗?

标签: python pandas time-series datetimeindex


【解决方案1】:

使用query方法:

df = pd.read_csv("my_file.csv", index_col=1, parse_dates=True)

In [121]: df.query("'2017-05-30' <= index <= '2017-06-01'")
Out[121]:
                                vm  LoadInt1
time
2017-05-31 10:00:00  abc-webapp-02  3.133333
2017-05-31 10:05:00  abc-webapp-02  0.000000
2017-05-31 10:10:00  abc-webapp-02  0.000000
2017-05-31 10:15:00  abc-webapp-02  0.000000
2017-05-31 10:20:00  abc-webapp-02  0.000000
2017-05-31 10:25:00  abc-webapp-02  0.000000
2017-05-31 10:30:00  abc-webapp-02  0.000000
2017-05-31 10:35:00  abc-webapp-02  0.000000
2017-05-31 10:40:00  abc-webapp-02  0.000000

【讨论】:

  • 谢谢!这行得通。我想知道为什么 loc 不起作用。
【解决方案2】:
  • 这种类型的索引切片包括端点,因此您所拥有的将包括整个样本集

    df.loc['2017-05-30':'2017-05-31']
    #df['2017-05-30':'2017-05-31']
    
                                    vm  LoadInt1
    time                                        
    2017-05-31 10:00:00  abc-webapp-02  3.133333
    2017-05-31 10:05:00  abc-webapp-02  0.000000
    2017-05-31 10:10:00  abc-webapp-02  0.000000
    2017-05-31 10:15:00  abc-webapp-02  0.000000
    2017-05-31 10:20:00  abc-webapp-02  0.000000
    2017-05-31 10:25:00  abc-webapp-02  0.000000
    2017-05-31 10:30:00  abc-webapp-02  0.000000
    2017-05-31 10:35:00  abc-webapp-02  0.000000
    2017-05-31 10:40:00  abc-webapp-02  0.000000
    
  • 这显示了相同的东西,但实际上是子集

    df.loc['2017-05-31 10:10':'2017-05-31 10:35']
    
                                    vm  LoadInt1
    time                                        
    2017-05-31 10:10:00  abc-webapp-02       0.0
    2017-05-31 10:15:00  abc-webapp-02       0.0
    2017-05-31 10:20:00  abc-webapp-02       0.0
    2017-05-31 10:25:00  abc-webapp-02       0.0
    2017-05-31 10:30:00  abc-webapp-02       0.0
    2017-05-31 10:35:00  abc-webapp-02       0.0
    
  • 您的导入可能会更小。你不需要解析器

    df = pd.read_csv("my_file.csv", parse_dates=[1], index_col=1)
    

【讨论】:

  • 问题是 df.loc['2017-05-30':'2017-05-31'] 对我不起作用。这让我很惊讶。它返回一个空系列。当我没有解析器时也是如此。有什么想法吗?
  • 您还在使用您使用的相同导入吗?我使用了我提到的那个,索引是DatetimeIndex。检查看看你的也是。 type(df.index) 如果不是,则意味着您无法转换为 datetime 并且。试试我的,我在第三个项目符号中发布。你用的是什么版本的熊猫? pd.__version__
  • 索引为:pandas.tseries.index.DatetimeIndex。熊猫版本是0.18.1。即使删除 'dateparse' 的东西,我得到相同的空结果。 :-(
  • @ArnabBiswas 脱掉loc 并做df['2017-05-30':'2017-05-31']
  • 没有。它不工作。一个问题是在我的 CSV 中,时间索引的间隔不相等。例如,对于最近的日期,每 5 分钟有一个数据点。对于一天前的数据,每半小时有一个数据点。数据越旧,越稀疏。这可能是一个原因吗?
猜你喜欢
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
相关资源
最近更新 更多