使用带有时间列的 Pandas 数据框

Posted

技术标签:

【中文标题】使用带有时间列的 Pandas 数据框【英文标题】:Playing with a Pandas Dataframe with Time Column 【发布时间】:2021-08-21 02:59:43 【问题描述】:

我正在研究一个大熊猫数据框,它有一个时间列(已排序),我想要删除任何重复的日期,并且在 1 天的增量内(比如说)。除此之外,我还在寻找的是创建另一列作为标签(基于时间)。所以举一个简单的例子(为简单起见,我只是在这里保留了时间列:

    df:
          
            Time Column

            2020-12-05
            2020-12-09
            2020-12-13
            2020-12-18
            2020-12-21
            2020-12-21
            2020-12-23
            2020-12-24
            2020-12-31
            2021-01-04

所以我在一个看起来像这样的输出数据框中寻找什么(在一天内删除重复项和日期并仅保留第一次出现之后 - 在示例中我有 2020-12-23 和 2020-12-24 和仅保留日期 23)并创建标签列:

       df:
          
            Time Column        Label

            2020-12-05          L1
            2020-12-09          L2
            2020-12-13          L3
            2020-12-18          L4
            2020-12-21          L5
            2020-12-23          L6
            2020-12-31          L7
            2021-01-04          L8

不知道如何实现这一点。我们将非常感谢这方面的任何帮助。

【问题讨论】:

【参考方案1】:
df['Time_Column']=pd.to_datetime(df['Time_Column'])#Coerce Time_Column to date
df=df[df['Time_Column'].diff(1).dt.days.ne(1)].drop_duplicates()#Remove consecutive dates and duplicates
df=df.assign(Label= 'L'+df['Time_Column'].notna().cumsum().astype(str))#Cumsum the Time_Column
print(df)



   Time_Column Label
0  2020-12-05    L1
1  2020-12-09    L2
2  2020-12-13    L3
3  2020-12-18    L4
4  2020-12-21    L5
6  2020-12-23    L6
8  2020-12-31    L7
9  2021-01-04    L8

【讨论】:

非常感谢@wwnde。它的工作原理除了一个警告。我还需要删除相差小于 2 天的任何连续日期(df 已经排序)。因此,在上述 2020-12-23 和 2020-12-24 的示例中,我只会保留 2020-12-23。那么我该如何实现呢?谢谢你的标签部分 完美。这也很好用!谢谢!比我更好的解决方案,【参考方案2】: 创建一个从时间列中提取日期的新列 删除此新列上的重复项 删除临时列
(df.assign(dt_day=lambda x: x['time column'].dt.date)
   .drop_duplicates('dt_day', keep='first')
   .drop(columns=['dt_day']))

【讨论】:

谢谢伊恩。问题是,它会删除重复项,但我还需要删除任何后续日期,相差不到 2 天。在上面的示例 2020-12-23 和 2020-12-24 中,应该保留一个 2020-12-23。【参考方案3】:

我做了这样的事情:

  df = pd.DataFrame(dt)
  df['time_column'] = pd.to_datetime(df['time_column'])
  mdf = df.copy()

  mdf = mdf.rename(columns='time_column': 'date_column')
  myf = df.diff(periods=1)
  finDF = myf.join(mdf,how='inner')

  mask = ['0 days', '1 days']
  finDF = finDF[~finDF['time_column'].isin(mask)]

  del finDF['time_column']

  finDF=finDF.assign(Label= 
      'L'+finDF['date_column'].notna().cumsum().astype(str))
 finDF

【讨论】:

以上是关于使用带有时间列的 Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

将 NumPy 数组转换为带有列的 Pandas 数据框

用 True/False 替换 pandas 数据框所有列的整数

如何自动命名 Pandas 数据框列?

使用带有pandas dataframe列的条件if / else逻辑

根据“小时”日期时间选择 Pandas 数据框行

在 Pandas 数据框列的子集上的管道中使用 scikit StandardScaler