向pandas DataFrame添加重复日期列

3

我是pandas的新手,我正在努力将日期添加到来自.csv文件的pandas数据框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')

请帮助我!!!

3个回答

0

如果你知道有多少组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。 - Camilla
你可以把它定义为一个变量,比如df.shape[0]/120或类似的内容。 - Jonathan Leon

0

这些是一样的,只是一个使用了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函数? - Camilla
是的,这是可能的。通常,λ函数用作高阶函数的参数。 - Peter T. Walker

0
你可以使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接