【问题标题】:Extend pandas DataFrame DatetimeIndex by 25 week days将 pandas DataFrame DatetimeIndex 延长 25 个工作日
【发布时间】:2019-06-22 13:13:28
【问题描述】:

我一直在尝试将我的 Pandas DataFrame 日期索引延长 25 个工作日。我编写的以下测试示例演示了该问题。工作日已正确生成,但并未附加到 DataFrame。

import pandas as pd
from business_calendar import Calendar

dates = pd.date_range('20190121', periods=5)
df = pd.DataFrame({'high': (58.22, 57.93, 57.51, 57.89, 58.77), 'low': (57.65, 57.15, 56.98, 57.12, 58.00)}, index=dates)

cal = Calendar()
last_idx = df.index[-1].date()
for i in range(1, 26):
    weekdays = pd.DatetimeIndex([cal.addbusdays(last_idx, i)])
    print("idx_count: {:2d} idx: {}".format(i, weekdays))
    df.index.append(weekdays)
print(df.index)

代码以 0 级错误退出,知道为什么 DataFrame 没有按预期更新吗?

【问题讨论】:

  • 不向DataFrame追加数据时,能否追加索引条目?
  • @w2kpro ,所以您想将索引延长 25 天?值应该是对的吗?

标签: python pandas datetime indexing


【解决方案1】:

您正在尝试以工作日为索引向 Dataframe 添加行,因此一种简单的方法是

for i in range(1, 26):
   weekdays = pd.DatetimeIndex([cal.addbusdays(last_idx, i)])
   #If you want the values to be na
   newRow = pd.DataFrame(index=weekdays)
   #Or if you want to give values to the new rows
   newRow = pd.DataFrame({'high': (42), 'low': (0)}, index=weekdays)

   df = df.append(newRow)

del newRow
print(df.index)

【讨论】:

  • 运行代码而不给出值有效,但会生成警告:frame.py:6701: FutureWarning: Sorting because non-concatenation axis is not aligned。未来版本的 pandas 将默认更改为不排序。要接受未来的行为,请传递 'sort=False'。要保留当前行为并使警告静音,请传递 'sort=True'。排序=排序)
  • 将排序参数设置为 false : df = df.append(newRow,sort=False)
  • 是的,这会抑制警告!
【解决方案2】:

对代码做了一些改动(cmets中的解释)

import pandas as pd
from business_calendar import Calendar

dates = pd.date_range('20190121', periods=5)
df = pd.DataFrame({'high': (58.22, 57.93, 57.51, 57.89, 58.77), 'low': (57.65, 57.15, 56.98, 57.12, 58.00)}, index=dates)

cal = Calendar()
last_idx = df.index[-1].date()
idx_list=[] #added this line
for i in range(1, 26):
    weekdays = pd.DatetimeIndex([cal.addbusdays(last_idx, i)])
    #print(weekdays[0])
    idx_list.append(weekdays[0]) #appending just the value so weekdays[0]
idx_list.extend(df.index) #extend the list with index
df.reindex(idx_list).sort_index() #reindex the df and sort the index

            high    low
2019-01-21  58.22  57.65
2019-01-22  57.93  57.15
2019-01-23  57.51  56.98
2019-01-24  57.89  57.12
2019-01-25  58.77  58.00
2019-01-28    NaN    NaN
2019-01-29    NaN    NaN
2019-01-30    NaN    NaN
.......................
....................
....

【讨论】:

  • 有趣。第二种解决方案更有效还是只是解决同一问题的不同方法?
  • 以上代码只是来自 Ichimoku Clouds 绘图程序的一个测试片段。其中两条移动平均线必须延长到未来 26 个周期。因此,DataFrame 的两列将具有超过当前日期的数值,而其他值将是 Nan。
  • @w2kpro 我没有测试过另一个,但看不出有什么理由不应该使用你的解决方案。所以决定只是修复它而不是创建一个新的解决方案。 :)
猜你喜欢
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 2020-08-12
  • 2022-12-05
  • 2016-11-23
  • 1970-01-01
  • 2018-11-02
相关资源
最近更新 更多