首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >正在将所有日期时间列(“<m8[ns]”)转换为在输出到HTML时仅显示日期值

正在将所有日期时间列(“<m8[ns]”)转换为在输出到HTML时仅显示日期值
EN

Stack Overflow用户
提问于 2018-07-14 22:03:00
回答 1查看 7.1K关注 0票数 3

我的项目涉及广泛的SQL查询,通过pandas将它们转换为python中的数据帧,按用户名列过滤,然后将过滤后的数据帧输出到单独的HTML文件,这些文件被转换为PDF并发布。

我遇到了一个问题,当日期列出现在HTML中时,它们是YY-MM-DD-HH-MM-SS,但我只是希望它们是YY-MM-DD,以使PDF输出看起来更干净。

我知道我可以使用以下命令将单个命名列转换为所需的输出:

dataset['datecolumn'] = dataset['datecolumn'].dt.date

我确实使用上面的方法解决了这个问题,方法是获得一个列名列表,然后应用一个for循环,如下所示:

datecollist = list(dataset.select_dtypes(include=['datetime64']).columns)
for i in datecollist:
    dataset[i] = dataset[i].dt.date

然而,我真的想找出一种更python的方法来解决这个问题,因为我想在我的代码中避免进一步的for循环,并通过python能力来改进。

到目前为止,我尝试了一个mapper函数,但没有成功:

mapper = lambda x: x.dt.date if isinstance(x, np.datetime64) else x
dataset.columns = dataset.columns.map(mapper)

它似乎只是跳过了我想要转换的列。我注意到,当我检查这些列的数据类型时,它们显示为:

in: dataset['First Date'].dtype
out: dtype('<M8[ns]')

有没有人可以建议我的mapper方法哪里出了问题,或者向我展示一种更有效/更干净的解决问题的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-15 01:43:42

由于您的数据来自SQL,另一种选择是在SQL中预先将所有日期时间转换为日期。例如,使用:

How to return only the Date from a SQL Server DateTime datatype

这只有在你的代码中从来不需要完整的日期时间时才有效--也就是说,所有的逻辑只使用日期。

虽然我也喜欢理解的优雅(不必编写for循环!),但我有时会觉得它们很笨拙和难以阅读,特别是使用条件逻辑和映射函数。此外,它们更难进行错误检查,因为它们试图将多个操作一起应用。

在本例中,我使用的是一个简单的检查和重新转换。

生成一些可测试的数据:

import pandas as pd
import numpy as np
from datetime import datetime

def make_data (n):

    ts1 = datetime.now().timestamp() + abs(np.random.normal(1000, 30, n)).cumsum()
    ts2 = datetime.now().timestamp() + abs(np.random.normal(2000, 10, n)).cumsum()

    df = pd.DataFrame({
        'c1': np.random.choice(list('ABCDEFGH'), n),
        'c2': np.random.choice(list('ABCDEFGH'), n),
        'c3': np.random.choice(list('ABCDEFGH'), n),
        'i1': np.random.randint(1, 20, n),
        't1': pd.to_datetime(ts1, unit='s'),
        't2': pd.to_datetime(ts2, unit='s'),
        'x1': np.random.randn(n),
        'x2': np.random.randn(n),
        'x3': np.random.randn(n)
        })

    return df

df = make_data(100)

然后使用以下命令将所有日期时间转换为日期:

# convert datetimes to just the date
for col in df.columns:
    if df[col].dtype == 'datetime64[ns]':
        df[col] = df[col].dt.date

更容易转换为具有错误检查功能的泛型函数(try、except),或者用于将对象转换为类别或将int转换为浮点型,或者...

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51340219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档