pandas 特定数据被定性为时间序列的标准是什么?

fnvucqvd  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(100)

我正在尝试做的是尝试检测数据集是否是时间序列?我想自动化这个过程。
假设我有以下数据集:

    • 一月一日**

| 标题1|标题2|标题1|标题2|
| - ------|- ------|- ------|- ------|
| 2023年1月1日|三十四|十二|三十四|
| 二〇二三年二月一日|四十二|九十九|四十二|
| 2023年3月1日|四十二|九十九|四十二|
| 2023年4月1日|四十二|九十九|四十二|

    • 一米一米一**

| 标题1|标题2|标题1|标题2|
| - ------|- ------|- ------|- ------|
| 2023年1月1日|三十四|十二|三十四|
| 2023年3月1日|四十二|九十九|四十二|
| 2023年4月1日|四十二|九十九|四十二|
| 2023年7月1日|四十二|九十九|四十二|

    • 一米二米一x**

| 标题1|标题2|标题1|标题2|
| - ------|- ------|- ------|- ------|
| 二〇二三年一月|三十四|十二|三十四|
| 二○二三年二月|四十二|九十九|四十二|
| 二○二三年三月|四十二|九十九|四十二|

    • 一米三米一x**

| 标题1|标题2|标题1|标题2|
| - ------|- ------|- ------|- ------|
| 小行星2020|三十四|十二|三十四|
| 小行星2021|四十二|九十九|四十二|
| 小行星2022|四十二|九十九|四十二|
df1具有均匀间隔的时间列,df2具有时间列但不均匀间隔df3df4具有格式不为datetime的时间列
在上面的df中,哪个是时间序列数据,哪个不是?将数据集视为时间序列
标准究竟是什么?

    • 谢谢**
jucafojl

jucafojl1#

如@GalodoLeste所示, Dataframe 是时间序列:

df1['Heading 1'] = pd.to_datetime(df1['Heading 1'], dayfirst=True)
df2['Heading 1'] = pd.to_datetime(df2['Heading 1'], dayfirst=True)
df3['Heading 1'] = pd.to_datetime(df3['Heading 1'])
df4['Heading 1'] = pd.to_datetime(df4['Heading 1'], format='%Y')

但第三个有频率,第一个没有

>>> df1['Heading 1'].dt.freq
'D'

>>> df2['Heading 1'].dt.freq
None

>>> df3['Heading 1'].dt.freq
'MS'

>>> df4['Heading 1'].dt.freq
'AS-JAN'
vawmfj5a

vawmfj5a2#

让我们假设这个例子:

Heading 1  Heading 2  Heading 3  Heading 4  Heading 5 Heading 6 Heading 7
0  1/1/2023         34         12         34       2000  Jan 2023  1/1/2023
1  2/1/2023         42         99         42       2001  Feb 2023       NaN
2  3/1/2023         42         99         42       2002  Mar 2023       NaN
3  4/1/2023         42         99         42       2003       NaN       NaN

您可以尝试使用panda执行的默认自动检测来转换to_datetime(这非常高效!)。

def find_datelike_cols(df):
    return df.columns[df.astype(str).apply(pd.to_datetime, errors='coerce').notna().any()]

cols = find_datelike_cols(df)
print(cols)

输出:

Index(['Heading 1', 'Heading 5', 'Heading 6', 'Heading 7'], dtype='object')

还可以添加最小匹配行数作为阈值,以确定列是否与日期时间类似:

def find_datelike_cols(df, thresh=None):
    mask = df.astype(str).apply(pd.to_datetime, errors='coerce').notna()
    return df.columns[mask.sum()>=thresh if thresh else mask.any()]

find_datelike_cols(df)
# Index(['Heading 1', 'Heading 5', 'Heading 6', 'Heading 7'], dtype='object')

find_datelike_cols(df, thresh=3)
# Index(['Heading 1', 'Heading 5', 'Heading 6'], dtype='object')

相关问题