【问题标题】:Convert Date Ranges to Time Series in Pandas在 Pandas 中将日期范围转换为时间序列
【发布时间】:2016-03-23 20:01:48
【问题描述】:

我的原始数据如下所示:

  start_date   end_date  value
0 2016-01-01 2016-01-03      2
1 2016-01-05 2016-01-08      4

解释是数据在 1/1/20161/3/2016 之间取值 2,它在 1/5/20161/8/2016 之间取值 4。我想将原始数据转换为每日时间序列,如下所示:

2016-01-01    2
2016-01-02    2
2016-01-03    2
2016-01-04    0
2016-01-05    4
2016-01-06    4
2016-01-07    4
2016-01-08    4

请注意,如果时间序列中的日期未出现在原始数据的任何行中的 start_dateend_date 之间,则在时间序列。

我可以通过循环遍历原始数据来创建时间序列,但这很慢。有更快的方法吗?

【问题讨论】:

  • 请检查您的预期输出或此条件if a date doesn't appear in the raw data, it gets a value of 0 - 为什么您有values != 0 日期:01,02,05,06,07?
  • 很抱歉给您带来了困惑。希望编辑能让它更清晰。

标签: python pandas time-series


【解决方案1】:

你可以试试这个:

In [120]: df
Out[120]:
  start_date   end_date  value
0 2016-01-01 2016-01-03      2
1 2016-01-05 2016-01-08      4

In [121]: new = pd.DataFrame({'dt': pd.date_range(df.start_date.min(), df.end_date.max())})

In [122]: new
Out[122]:
          dt
0 2016-01-01
1 2016-01-02
2 2016-01-03
3 2016-01-04
4 2016-01-05
5 2016-01-06
6 2016-01-07
7 2016-01-08

In [123]: new = new.merge(df, how='left', left_on='dt', right_on='start_date').fillna(method='pad')

In [124]: new
Out[124]:
          dt start_date   end_date  value
0 2016-01-01 2016-01-01 2016-01-03    2.0
1 2016-01-02 2016-01-01 2016-01-03    2.0
2 2016-01-03 2016-01-01 2016-01-03    2.0
3 2016-01-04 2016-01-01 2016-01-03    2.0
4 2016-01-05 2016-01-05 2016-01-08    4.0
5 2016-01-06 2016-01-05 2016-01-08    4.0
6 2016-01-07 2016-01-05 2016-01-08    4.0
7 2016-01-08 2016-01-05 2016-01-08    4.0

In [125]: new.ix[(new.dt < new.start_date) | (new.dt > new.end_date), 'value'] = 0

In [126]: new[['dt', 'value']]
Out[126]:
          dt  value
0 2016-01-01    2.0
1 2016-01-02    2.0
2 2016-01-03    2.0
3 2016-01-04    0.0
4 2016-01-05    4.0
5 2016-01-06    4.0
6 2016-01-07    4.0
7 2016-01-08    4.0

【讨论】:

  • 谢谢。这比我使用的循环快几个数量级。
  • @hahdawg,很高兴我能帮上忙 :)
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
相关资源
最近更新 更多