【问题标题】:Slicing data frame with datetime columns (Python - Pandas)使用日期时间列切片数据框(Python - Pandas)
【发布时间】:2021-06-04 11:31:03
【问题描述】:

通过 loc 和 iloc 方法,Pandas 允许我们对数据帧进行切片。不过,当列是日期时间对象时,我仍然无法执行此操作。

例如,假设如下代码生成的数据框:

d = {'col1': [1], 'col2': [2],'col3': [3]}
df = pd.DataFrame(data=d)
dates = ['01-01-2001','02-02-2002','03-03-2003']
dates = pd.to_datetime(dates).date
df.columns= dates

让我们尝试通过 dfloc 对数据帧的前两列进行切片:

df.loc[0,'01-01-2001':'02-02-2002']

我们得到以下 TypeError:'

如何解决?

【问题讨论】:

  • 更改 dates = pd.to_datetime(dates).date -> dates = pd.to_datetime(dates) 应该这样做。
  • @Ch3steR,你能解释一下为什么会这样吗?

标签: python pandas dataframe datetime slice


【解决方案1】:
df.iloc[0,[0,1]]

使用 iloc 或 loc ,但在第二个参数中给出列名作为该列的索引,并且您正在传递字符串,只需给出索引

【讨论】:

  • 如果我想在代码中使用列名怎么办?例如,当我有一个包含数百个日期的数据框并且不知道每个日期的位置时?
  • 首先通过 issubset() 方法检查数据帧中是否存在列,现在如果它存在而不是通过 get_loc() 方法获取列索引,现在您可以在 loc 或 iloc 中使用索引
【解决方案2】:

从上面那条线的@Ch3steR 评论中捎带应该可以工作。

dates = pd.to_datetime(dates)

此时,日期转换应该允许您根据下面列出的日期为该范围内的列建立索引。只需确保结束日期稍早于您尝试捕获的结束日期即可。

# Return all rows in columns between date range 1/1/2001 and 2/3/2002
df.loc[:, '1/1/2001':'2/3/2002']

   2001-01-01  2002-02-02
0           1           2

【讨论】:

    【解决方案3】:

    您可以从之前创建的列表中调用日期,并且不会出错。

    d = {'col1': [1], 'col2': [2],'col3': [3]}
    df = pd.DataFrame(data=d)
    dates = ['01-01-2001','02-02-2002','03-03-2003']
    dates = pd.to_datetime(dates).date
    df.columns= dates
    
    df.loc[0,dates[0]:dates[1]]
    

    这里有两种不同的格式。坚持一种格式很重要。从列表中调用有效,因为它保证格式是相同的。但正如您所说,您需要能够使用任何日期,以便第二个更适合您。

    >>>dates = pd.to_datetime(dates).date
    >>>print("With .date")
    With .date
    >>>print(dates)
    [datetime.date(2001, 1, 1) datetime.date(2002, 2, 2)
     datetime.date(2003, 3, 3)]
    
    >>>dates = pd.to_datetime(dates)
    >>>print("Without .date")
    Without .date
    >>>print(dates)
    DatetimeIndex(['2001-01-01', '2002-02-02', '2003-03-03'], dtype='datetime64[ns]', freq=None)
    

    【讨论】:

    • 打电话?你能详细说明你做了什么吗?
    • 另外,这只是一个例子。我实际上想使用 df.loc 中的日期。例如,假设我有一个包含数百列的数据框,我想使用日期“10-10-2010”和“12-12-2012”,但我不知道它们在数据框中的位置。跨度>
    • 类似于@Ch3steR 的答案,只是保持格式相同很重要。我添加了两种不同格式的示例,一种使用 .date,一种不使用。
    猜你喜欢
    • 2013-04-17
    • 2021-05-27
    • 2019-11-23
    • 2018-09-26
    • 2021-05-09
    • 1970-01-01
    • 2015-10-30
    • 2023-03-09
    • 2017-01-16
    相关资源
    最近更新 更多