gpt4 book ai didi

python - 日期列中的 Pandas 多个日期范围

转载 作者:太空狗 更新时间:2023-10-30 00:30:59 25 4
gpt4 key购买 nike

当前 df:

ID  Date
11 3/19/2018
22 1/5/2018
33 2/12/2018
.. ..

我有带 ID 和日期的 df。 ID在原始df中是唯一的。我想根据日期创建一个新的 df。每个 ID 都有一个最大日期,我想使用该日期并返回 4 天(每个 ID 5 行)有成千上万的 ID。

期望得到:

ID  Date
11 3/15/2018
11 3/16/2018
11 3/17/2018
11 3/18/2018
11 3/19/2018
22 1/1/2018
22 1/2/2018
22 1/3/2018
22 1/4/2018
22 1/5/2018
33 2/8/2018
33 2/9/2018
33 2/10/2018
33 2/11/2018
33 2/12/2018
… …

我尝试了以下方法,我认为使用 date_range 可能是正确的方向,但我总是出错。

pd.date_range

def date_list(row):
list = pd.date_range(row["Date"], periods=5)
return list

df["Date_list"] = df.apply(date_list, axis = "columns")

最佳答案

这是另一个通过使用 df.assign 覆盖 datepd.concat 将范围粘合在一起。 cᴏʟᴅsᴘᴇᴇᴅ 的解决方案在性能上胜出,但我认为这可能是一个很好的补充,因为它很容易阅读和理解。

df = pd.concat([df.assign(Date=df.Date - pd.Timedelta(days=i)) for i in range(5)])

备选方案:

dates = (pd.date_range(*x) for x in zip(df['Date']-pd.Timedelta(days=4), df['Date']))

df = (pd.DataFrame(dict(zip(df['ID'],dates)))
.T
.stack()
.reset_index(0)
.rename(columns={'level_0': 'ID', 0: 'Date'}))

完整示例:

import pandas as pd

data = '''\
ID Date
11 3/19/2018
22 1/5/2018
33 2/12/2018'''

# Recreate dataframe
df = pd.read_csv(pd.compat.StringIO(data), sep='\s+')
df['Date']= pd.to_datetime(df.Date)

df = pd.concat([df.assign(Date=df.Date - pd.Timedelta(days=i)) for i in range(5)])
df.sort_values(by=['ID','Date'], ascending = [True,True], inplace=True)
print(df)

返回:

   ID       Date
0 11 2018-03-15
0 11 2018-03-16
0 11 2018-03-17
0 11 2018-03-18
0 11 2018-03-19
1 22 2018-01-01
1 22 2018-01-02
1 22 2018-01-03
1 22 2018-01-04
1 22 2018-01-05
2 33 2018-02-08
2 33 2018-02-09
2 33 2018-02-10
2 33 2018-02-11
2 33 2018-02-12

关于python - 日期列中的 Pandas 多个日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50379914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com