如何使用 pd.to_datetime() 设置频率?

Posted

技术标签:

【中文标题】如何使用 pd.to_datetime() 设置频率?【英文标题】:How to set frequency with pd.to_datetime()? 【发布时间】:2019-07-04 21:59:06 【问题描述】:

在拟合 statsmodel 时,我收到有关日期频率的警告。

首先,我导入一个数据集:

import statsmodels as sm
df = sm.datasets.get_rdataset(package='datasets', dataname='airquality').data

df['Year'] = 1973
df['Date'] = pd.to_datetime(df[['Year', 'Month', 'Day']])

df.drop(columns=['Year', 'Month', 'Day'], inplace=True)
df.set_index('Date', inplace=True, drop=True)

接下来我尝试拟合 SES 模型:

fit = sm.tsa.api.SimpleExpSmoothing(df['Wind']).fit()

返回此警告:

/anaconda3/lib/python3.6/site-packages/statsmodels/tsa/base/tsa_model.py:171:ValueWarning:未提供频率信息,因此将使用推断的频率 D。 % 频率,值警告)

我的数据集是每天的,所以推断“D”没问题,但我想知道如何手动设置频率。

请注意,DatetimeIndex 没有频率(最后一行)...

DatetimeIndex(['1973-05-01', '1973-05-02', '1973-05-03', '1973-05-04',
               '1973-05-05', '1973-05-06', '1973-05-07', '1973-05-08',
               '1973-05-09', '1973-05-10',
               ...
               '1973-09-21', '1973-09-22', '1973-09-23', '1973-09-24',
               '1973-09-25', '1973-09-26', '1973-09-27', '1973-09-28',
               '1973-09-29', '1973-09-30'],
              dtype='datetime64[ns]', name='Date', length=153, freq=None)

根据this answer,我检查了缺少的日期,但似乎没有:

pd.date_range(start = '1973-05-01', end = '1973-09-30').difference(df.index)

DatetimeIndex([], dtype='datetime64[ns]', freq='D')

我应该如何设置索引的频率?

【问题讨论】:

【参考方案1】:

我认为pd.to_datetime没有设置默认频率,需要DataFrame.asfreq

df = df.set_index('Date').asfreq('d')
print (df.index)

DatetimeIndex(['1973-05-01', '1973-05-02', '1973-05-03', '1973-05-04',
               '1973-05-05', '1973-05-06', '1973-05-07', '1973-05-08',
               '1973-05-09', '1973-05-10',
               ...
               '1973-09-21', '1973-09-22', '1973-09-23', '1973-09-24',
               '1973-09-25', '1973-09-26', '1973-09-27', '1973-09-28',
               '1973-09-29', '1973-09-30'],
              dtype='datetime64[ns]', name='Date', length=153, freq='D')

但是如果索引中的重复值得到错误:

df = pd.concat([df, df])
df = df.set_index('Date')

print (df.asfreq('d').index)

ValueError: 无法从重复的轴重新索引

解决方案是使用 resample 和一些聚合函数:

print (df.resample('2D').mean().index)

DatetimeIndex(['1973-05-01', '1973-05-03', '1973-05-05', '1973-05-07',
               '1973-05-09', '1973-05-11', '1973-05-13', '1973-05-15',
               '1973-05-17', '1973-05-19', '1973-05-21', '1973-05-23',
               '1973-05-25', '1973-05-27', '1973-05-29', '1973-05-31',
               '1973-06-02', '1973-06-04', '1973-06-06', '1973-06-08',
               '1973-06-10', '1973-06-12', '1973-06-14', '1973-06-16',
               '1973-06-18', '1973-06-20', '1973-06-22', '1973-06-24',
               '1973-06-26', '1973-06-28', '1973-06-30', '1973-07-02',
               '1973-07-04', '1973-07-06', '1973-07-08', '1973-07-10',
               '1973-07-12', '1973-07-14', '1973-07-16', '1973-07-18',
               '1973-07-20', '1973-07-22', '1973-07-24', '1973-07-26',
               '1973-07-28', '1973-07-30', '1973-08-01', '1973-08-03',
               '1973-08-05', '1973-08-07', '1973-08-09', '1973-08-11',
               '1973-08-13', '1973-08-15', '1973-08-17', '1973-08-19',
               '1973-08-21', '1973-08-23', '1973-08-25', '1973-08-27',
               '1973-08-29', '1973-08-31', '1973-09-02', '1973-09-04',
               '1973-09-06', '1973-09-08', '1973-09-10', '1973-09-12',
               '1973-09-14', '1973-09-16', '1973-09-18', '1973-09-20',
               '1973-09-22', '1973-09-24', '1973-09-26', '1973-09-28',
               '1973-09-30'],
              dtype='datetime64[ns]', name='Date', freq='2D')

【讨论】:

【参考方案2】:

问题是由未明确设置的频率引起的。在大多数情况下,您无法确定您的数据没有任何间隙,因此使用

生成一个数据范围

rng = pd.date_range(start = '1973-05-01', end = '1973-09-30', freq='D')

用这个rng重新索引你的DataFrame,并用你选择的方法或值填充np.nan

【讨论】:

“方法或选择值”表示 asfreq() 函数的参数“方法”或“填充值”,详见pandas.pydata.org/pandas-docs/stable/reference/api/…。

以上是关于如何使用 pd.to_datetime() 设置频率?的主要内容,如果未能解决你的问题,请参考以下文章

使用 pd.to_datetime 处理多种日期时间格式

为啥 pandas 在调用 pd.to_datetime() 时返回时间戳而不是 datetime 对象?

pd.datetime( )和pd.to_datetime( )

pd.datetime 没有正确索引

pd.to_datetime 上的未知字符串格式

时间转换py.datetime & pd.to_datetime