【问题标题】:Adding repeating date column to pandas DataFrame将重复日期列添加到 pandas DataFrame
【发布时间】:2021-08-13 05:45:55
【问题描述】:

我是 pandas 的新手,我正在努力将日期添加到来自 .csv 文件的 pandas dataFrame df。我有一个带有几个唯一 id 的数据框,每个 id 有 120 个月,我需要添加一个列日期。每个 id 应该有 120 个周期的完全相同的日期。我正在努力添加它们,因为在第一个 id 之后还有另一个 id 并且日期应该重新开始。我在 csv 文件中的数据如下所示:

month       id   
  1         1593
  2         1593
 ...
 120        1593
  1         8964
  2         8964
 ...
 120        8964
 1          58944
 ...

这是我的代码,我不确定如何使用 groupby 方法根据 id 为我的数据框添加日期:

group=df.groupby('id')
group['date']=pd.date_range(start='2020/6/1', periods=120, freq='MS').shift(14,freq='D')

请帮帮我!!!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用 Pandas transform。我就是这样解决的:

    dataf['dates'] = \
        (dataf
          .groupby("id")
          .transform(lambda d: pd.date_range(start='2020/6/1', periods=d.max(), freq='MS').shift(14,freq='D')
    )
    

    结果:

       month     id      dates
    0      1   1593 2020-06-15
    1      2   1593 2020-07-15
    2      3   1593 2020-08-15
    3      1   8964 2020-06-15
    4      2   8964 2020-07-15
    5      1  58944 2020-06-15
    6      2  58944 2020-07-15
    7      3  58944 2020-08-15
    8      4  58944 2020-09-15
    

    测试数据:

    import io
    import pandas as pd
    
    dataf = pd.read_csv(io.StringIO("""
    month,id
      1,1593
      2,1593
     3,1593
      1,8964
      2,8964
     1,58944
     2,58944
     3,58944
     4,58944""")).astype(int)
    

    【讨论】:

      【解决方案2】:

      除了使用 lambda 之外,其他都是一样的

      def repeatingDates(numIds): return [d.strftime(
          '%Y/%m/%d') for d in pandas.date_range(start='2020/6/1', periods=120, freq='MS')] * numIds
      
      
      repeatingDates = lambda numIds: [d.strftime(
          '%Y/%m/%d') for d in pandas.date_range(start='2020/6/1', periods=120, freq='MS')] * numIds
      

      【讨论】:

      • 这个函数可以写成lambda函数吗?
      • 是的,这是可能的。通常 lambda 函数用作高阶函数中的参数
      【解决方案3】:

      如果你知道你有多少组 120,你可以用这个。把最后的2改一下就行了。此示例创建了两次重复的 120 个日期。您可能需要适应您的特定用途。

      new_dates = list(pd.date_range(start='2020/6/1', periods=120, freq='MS').shift(14,freq='D'))*2
      
      df = pd.DataFrame({'date': new_dates})
      

      【讨论】:

      • 我不认为它会起作用,因为 120 个周期的集合会改变它可能是 100 或 5000
      • 您将其设为 df.shape[0]/120 或类似的变量
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 2018-11-29
      • 2018-07-19
      • 2017-06-04
      • 1970-01-01
      • 2017-05-21
      • 2012-05-06
      相关资源
      最近更新 更多