首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为列"start_date“和列"end_date”中的每一行创建start_date()?

如何为列"start_date“和列"end_date”中的每一行创建start_date()?
EN

Stack Overflow用户
提问于 2021-03-18 11:13:23
回答 2查看 1.2K关注 0票数 1

我有一个df,就像:

代码语言:javascript
复制
id | start_date | end_date  | price
1  | 2020-10-01 | 2020-10-3 | 1
1  | 2020-10-03 | 2020-10-4 | 1
2  | 2020-10-04 | 2020-10-6 | 2
3  | 2020-10-05 | 2020-10-5 | 3

列"start_date“和"end_date”是datetime64ns。

我想要从日期范围创建一个“日期”列。

最简单的方法是创建一个pandas.date_range(start_date,end_date,freq="D"),然后使用.explode()。

最终结果应该如下所示:

代码语言:javascript
复制
id | start_date | end_date  | price | date
1  | 2020-10-01 | 2020-10-3 | 1     | 2020-10-01
1  | 2020-10-01 | 2020-10-3 | 1     | 2020-10-02
1  | 2020-10-01 | 2020-10-3 | 1     | 2020-10-03
1  | 2020-10-03 | 2020-10-4 | 1     | 2020-10-03
1  | 2020-10-03 | 2020-10-4 | 1     | 2020-10-04
2  | 2020-10-04 | 2020-10-6 | 2     | 2020-10-04
2  | 2020-10-04 | 2020-10-6 | 2     | 2020-10-05
2  | 2020-10-04 | 2020-10-6 | 2     | 2020-10-06
3  | 2020-10-05 | 2020-10-5 | 3     | 2020-10-05

迄今已尝试过:

代码语言:javascript
复制
df["daterange"] = pd.date_range(df["start_date"], df["end_date"])

TypeError:无法转换输入[0 2020-10-01 1 2020-10-01 ]

代码语言:javascript
复制
for row in df.itertuples():
    df["daterange"] = pd.date_range(start=row.start_date, end=row.end_date)

ValueError:值的长度(3)与索引长度(9)不匹配

Lambdas、apply、熔体等对于我的数据大小来说太慢了,无法使用!

/edit

我到目前为止发现的Fastet方法:

代码语言:javascript
复制
https://github.com/Garve/scikit-bonus
skbonus.pandas.preprocessing.DateTimeExploder(
        "date",
        start_column="start_date",
        end_column="end_date",
        frequency="d",
        drop=False,
    )
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-13 08:23:01

我到目前为止发现的禁食法:

代码语言:javascript
复制
https://github.com/Garve/scikit-bonus
from skbonus.pandas.preprocessing import DateTimeExploder
df = DateTimeExploder(
        "date",
        start_column="start_date",
        end_column="end_date",
        frequency="d",
        drop=False,
    )
票数 0
EN

Stack Overflow用户

发布于 2021-03-18 11:20:39

使用DataFrame.apply

代码语言:javascript
复制
df["daterange"] = df.apply(lambda x: pd.date_range(x.start_date, x.end_date), axis=1)
df = df.explode('daterange').reset_index(drop=True)
print (df)
   id  start_date   end_date  price  daterange
0   1  2020-10-01  2020-10-3      1 2020-10-01
1   1  2020-10-01  2020-10-3      1 2020-10-02
2   1  2020-10-01  2020-10-3      1 2020-10-03
3   1  2020-10-03  2020-10-4      1 2020-10-03
4   1  2020-10-03  2020-10-4      1 2020-10-04
5   2  2020-10-04  2020-10-6      2 2020-10-04
6   2  2020-10-04  2020-10-6      2 2020-10-05
7   2  2020-10-04  2020-10-6      2 2020-10-06
8   3  2020-10-05  2020-10-5      3 2020-10-05

备选方案:

代码语言:javascript
复制
s = pd.concat([pd.Series(r.Index,pd.date_range(r.start_date, r.end_date)) for r in df.itertuples()])
s = pd.Series(s.index, s)

df = df.join(s.rename('daterange')).reset_index(drop=True)
print (df)
   id  start_date   end_date  price  daterange
0   1  2020-10-01  2020-10-3      1 2020-10-01
1   1  2020-10-01  2020-10-3      1 2020-10-02
2   1  2020-10-01  2020-10-3      1 2020-10-03
3   1  2020-10-03  2020-10-4      1 2020-10-03
4   1  2020-10-03  2020-10-4      1 2020-10-04
5   2  2020-10-04  2020-10-6      2 2020-10-04
6   2  2020-10-04  2020-10-6      2 2020-10-05
7   2  2020-10-04  2020-10-6      2 2020-10-06
8   3  2020-10-05  2020-10-5      3 2020-10-05
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66689956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档