【问题标题】:Date_range between 2 columns两列之间的日期范围
【发布时间】:2020-02-20 19:43:42
【问题描述】:

我对 Python 和数据科学有点陌生。

我有一个包含 2 个日期时间列 AB 的数据集:

                     A                    B
0  2019-03-13 08:12:20  2019-03-13 08:12:25
1  2019-03-15 10:02:18  2019-03-13 10:02:20

对于每一行,我想在 A 列和 B 列之间生成以秒为单位的日期范围,因此我应该得到这个:

                    A
0 2019-03-13 08:12:20
1 2019-03-13 08:12:21
2 2019-03-13 08:12:22
3 2019-03-13 08:12:23
4 2019-03-13 08:12:24
5 2019-03-13 08:12:25

我让它工作了:

import pandas as pd, numpy as np

df=pd.DataFrame({'A': ["2019-03-13 08:12:20", "2019-03-15 10:02:18"], 'B': ["2019-03-13 08:12:25", "2019-03-13 10:02:20"]})
l=[pd.date_range(start=df.iloc[i]['A'], end=df.iloc[i]['B'], freq='S') for i in range(len(df))]
df1=(pd.DataFrame(l).T)[0]
print(df1)

但是因为我有 1M 行,运行时间太长,而且我知道这个解决方案并不是最好的,请你们告诉我最好的方法是什么?

【问题讨论】:

  • df.apply(lambda row : list(pd.date_range(row['A'], end=row['B'], freq='S')), axis=1).explode()
  • 我有一个大约 1M 行的数据集,我认为 apply 不能胜任 x)

标签: python pandas numpy data-manipulation


【解决方案1】:

这是必要的循环,一种可能的列表理解和展平解决方案:

l = [x for a, b in zip(df.A, df.B) for x in pd.date_range(a, b, freq='S')]
df1= pd.DataFrame({'A':l})
print(df1)
                    A
0 2019-03-13 08:12:20
1 2019-03-13 08:12:21
2 2019-03-13 08:12:22
3 2019-03-13 08:12:23
4 2019-03-13 08:12:24
5 2019-03-13 08:12:25

另一种解决方案:

df1 = (pd.concat([pd.Series(pd.date_range(r.A, r.B, freq='S')) for r in df.itertuples()])
         .to_frame('A'))
print (df1)
                    A
0 2019-03-13 08:12:20
1 2019-03-13 08:12:21
2 2019-03-13 08:12:22
3 2019-03-13 08:12:23
4 2019-03-13 08:12:24
5 2019-03-13 08:12:25

【讨论】:

  • 有没有其他方法可以在没有循环的情况下实现这一点?
  • 是的,apply 仍然是引擎盖下的循环,因此无法使用,可能在 numpy 中存在一些 beetr 解决方案。
  • 你能指导我使用 numpy 正确的方法吗?
猜你喜欢
  • 2023-03-30
  • 2013-11-23
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多