如何识别 pandas 数据框中的哪些列仅是日期或仅是时间?

发布于 2025-01-14 04:14:06 字数 1234 浏览 0 评论 0原文

我正在编写一个尝试识别列类型的函数。具体来说,它应该能够判断该列是仅日期类型还是仅时间类型。我根据堆栈溢出的答案尝试了下面的代码,但它无法识别并且总是遇到 except 块。下面是示例数据框。我尝试在 Dob 列上运行函数,它返回“它不是日期字段”

在此处输入图像描述

def check(col):
    try:
        dt = pd.to_datetime(df[col])

        if (dt.dt.floor('d') == dt).all():
            return ('Its a pure date field')
        elif (dt.dt.date == pd.Timestamp('now').date()).all():
            return ('Its a pure time field')
        else:
            return ('Its a Datetime field') 
    except:
        return ('its not a datefield')

可重现的输入 DataFrame :

df = pd.DataFrame({'Name': {0: 'Son', 1: 'Daughter', 2: 'Daughter2', 3: 'Mummy', 4: 'Daddy'}, 'Dob': {0: Timestamp('1986-01-05 00:00:00'), 1: Timestamp('1986-12-09 00:00:00'), 2: Timestamp('1988-07-04 00:00:00'), 3: Timestamp('1968-09-11 00:00:00'), 4: Timestamp('1965-07-02 00:00:00')}, 'Exp': {0: 2.5, 1: 13.5, 2: 24.5, 3: 35.5, 4: 46.5}, 'Time': {0: datetime.time(2, 45), 1: datetime.time(1, 45), 2: datetime.time(1, 45), 3: datetime.time(2, 45), 4: datetime.time(2, 55)}, 'Code': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}})

I am writing a function that tries to identify the type of column. Specifically it should be able to tell if the column is only date type or only time type. I tried the below code as per an answer from stack overflow but it fails to identify and always runs into the except block. Below is sample dataframe. I tried running function on Dob column and it returns ''its not a datefield'

enter image description here

def check(col):
    try:
        dt = pd.to_datetime(df[col])

        if (dt.dt.floor('d') == dt).all():
            return ('Its a pure date field')
        elif (dt.dt.date == pd.Timestamp('now').date()).all():
            return ('Its a pure time field')
        else:
            return ('Its a Datetime field') 
    except:
        return ('its not a datefield')

Reproducible input DataFrame :

df = pd.DataFrame({'Name': {0: 'Son', 1: 'Daughter', 2: 'Daughter2', 3: 'Mummy', 4: 'Daddy'}, 'Dob': {0: Timestamp('1986-01-05 00:00:00'), 1: Timestamp('1986-12-09 00:00:00'), 2: Timestamp('1988-07-04 00:00:00'), 3: Timestamp('1968-09-11 00:00:00'), 4: Timestamp('1965-07-02 00:00:00')}, 'Exp': {0: 2.5, 1: 13.5, 2: 24.5, 3: 35.5, 4: 46.5}, 'Time': {0: datetime.time(2, 45), 1: datetime.time(1, 45), 2: datetime.time(1, 45), 3: datetime.time(2, 45), 4: datetime.time(2, 55)}, 'Code': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}})

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

面如桃花 2025-01-21 04:14:06

对于我提供的示例来说,它工作得很好,但是我修改了该函数以将 Series 作为输入,以确保不依赖于全局 df 对象。

def check(s):
    try:
        dt = pd.to_datetime(s)
        if (dt.dt.floor('d') == dt).all():
            return ('Its a pure date field')
        elif (dt.dt.date == pd.Timestamp('now').date()).all():
            return ('Its a pure time field')
        else:
            return ('Its a Datetime field') 
    except:
        return ('its not a datefield')


check(df['Dob'])

输出:“它是一个纯日期字段”

It is working fine for me with the provided sample, however I modified the function to take a Series as input to ensure not relying on a global df object.

def check(s):
    try:
        dt = pd.to_datetime(s)
        if (dt.dt.floor('d') == dt).all():
            return ('Its a pure date field')
        elif (dt.dt.date == pd.Timestamp('now').date()).all():
            return ('Its a pure time field')
        else:
            return ('Its a Datetime field') 
    except:
        return ('its not a datefield')


check(df['Dob'])

Output: 'Its a pure date field'

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文