基于数据范围的Pandas索引重建

fumotvh3  于 2023-01-19  发布在  其他
关注(0)|答案(2)|浏览(134)

我正在尝试重新索引Pandas的日期。这是因为有些日期丢失了,比如周末或国家假日。
要做到这一点,我使用以下代码:

import pandas as pd
import yfinance as yf 
import datetime 

start = datetime.date(2015,1,1)
end = datetime.date.today()

df = yf.download('F', start, end, interval ='1d', progress = False)
df.index = df.index.strftime('%Y-%m-%d')
full_dates = pd.date_range(start, end)
df.reindex(full_dates)

此代码生成此 Dataframe :

Open    High    Low     Close   Adj Close   Volume
2015-01-01  NaN     NaN     NaN     NaN     NaN     NaN
2015-01-02  NaN     NaN     NaN     NaN     NaN     NaN
2015-01-03  NaN     NaN     NaN     NaN     NaN     NaN
2015-01-04  NaN     NaN     NaN     NaN     NaN     NaN
2015-01-05  NaN     NaN     NaN     NaN     NaN     NaN
...     ...     ...     ...     ...     ...     ...
2023-01-13  NaN     NaN     NaN     NaN     NaN     NaN
2023-01-14  NaN     NaN     NaN     NaN     NaN     NaN
2023-01-15  NaN     NaN     NaN     NaN     NaN     NaN
2023-01-16  NaN     NaN     NaN     NaN     NaN     NaN
2023-01-17  NaN     NaN     NaN     NaN     NaN     NaN

你能告诉我为什么它不重新索引数据,而是显示NaN值吗?
===编辑===
可能是python版本的问题吗?我在python 3.7和3.10中运行了相同的代码
在python 3.7中

在python 3.10中

在python3.10中-如图所示,它是日期时间。

正在获取yf.download('F', start, end, interval ='1d', progress = False)之后的日期时间而不获取strftime

bnl4lu3b

bnl4lu3b1#

删除按df.index = df.index.strftime('%Y-%m-%d')DatetimeIndex转换为字符串的操作,因此可以按日期时间将reindex转换为字符串。

df = yf.download('F', start, end, interval ='1d', progress = False)
full_dates = pd.date_range(start, end)
df = df.reindex(full_dates)

print (df)
             Open   High    Low  Close  Adj Close      Volume
2015-01-01    NaN    NaN    NaN    NaN        NaN         NaN
2015-01-02  15.59  15.65  15.18  15.36  10.830517  24777900.0
2015-01-03    NaN    NaN    NaN    NaN        NaN         NaN
2015-01-04    NaN    NaN    NaN    NaN        NaN         NaN
2015-01-05  15.12  15.13  14.69  14.76  10.407450  44079700.0
          ...    ...    ...    ...        ...         ...
2023-01-13  12.63  12.82  12.47  12.72  12.720000  96317800.0
2023-01-14    NaN    NaN    NaN    NaN        NaN         NaN
2023-01-15    NaN    NaN    NaN    NaN        NaN         NaN
2023-01-16    NaN    NaN    NaN    NaN        NaN         NaN
2023-01-17    NaN    NaN    NaN    NaN        NaN         NaN

[2939 rows x 6 columns]

print (df.index)
DatetimeIndex(['2015-01-01', '2015-01-02', '2015-01-03', '2015-01-04',
               '2015-01-05', '2015-01-06', '2015-01-07', '2015-01-08',
               '2015-01-09', '2015-01-10',
               ...
               '2023-01-08', '2023-01-09', '2023-01-10', '2023-01-11',
               '2023-01-12', '2023-01-13', '2023-01-14', '2023-01-15',
               '2023-01-16', '2023-01-17'],
              dtype='datetime64[ns]', length=2939, freq='D')

编辑:存在timezone差异,要删除它,请使用DatetimeIndex.tz_convert

df = yf.download('F', start, end, interval ='1d', progress = False)

df.index= df.index.tz_convert(None)

full_dates = pd.date_range(start, end)
df = df.reindex(full_dates)
print (df)
slhcrj9b

slhcrj9b2#

您需要在reindex中使用字符串来保持同构类型,否则panda将无法匹配带有Timestamp(例如pd.Timestamp('2015-01-02'))的字符串(例如2015-01-02):

df.reindex(full_dates.astype(str))

#or
df.reindex(full_dates.strftime('%Y-%m-%d'))

输出:

Open   High    Low  Close  Adj Close      Volume
2015-01-01    NaN    NaN    NaN    NaN        NaN         NaN
2015-01-02  15.59  15.65  15.18  15.36  10.830517  24777900.0
2015-01-03    NaN    NaN    NaN    NaN        NaN         NaN
2015-01-04    NaN    NaN    NaN    NaN        NaN         NaN
2015-01-05  15.12  15.13  14.69  14.76  10.407451  44079700.0
...           ...    ...    ...    ...        ...         ...
2023-01-13  12.63  12.82  12.47  12.72  12.720000  96317800.0
2023-01-14    NaN    NaN    NaN    NaN        NaN         NaN
2023-01-15    NaN    NaN    NaN    NaN        NaN         NaN
2023-01-16    NaN    NaN    NaN    NaN        NaN         NaN
2023-01-17    NaN    NaN    NaN    NaN        NaN         NaN

[2939 rows x 6 columns]

相关问题