pd.read_csv(parse_dates... [date_formatter=])返回dtype为'object'而非'datetime64

2 投票
1 回答
1736 浏览
提问于 2025-04-18 03:28

我的输入CSV文件里有两个时间日期列,分别是'开始时间'和'结束时间',它们的格式是时间戳。

我可以正确解析这些时间戳,但我就是无法把结果列变成datetime64格式!

无论我是否使用自定义的日期格式化函数mdb_to_datetime(),或者把它注释掉,结果列始终是'np.object',这其实是'np.string'的一个包装。(这在后面进行日期计算时会出问题。)

我尝试在读取CSV后,对结果的对象(字符串)列使用cal['开始时间'].astype(np.datetime64),但也失败了。

from datetime import datetime

def mdb_to_datetime(ts):
    """Convert Access MDB to datetime"""
    return datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M')

cal = pd.read_csv('my.csv', header=0,
    usecols = ['Start Time','End Time','Summary'],
    parse_dates = ['Start Time','End Time'] )
    #, date_parser = mdb_to_datetime )

# my.csv looks like (uninteresting columns removed):
Start Time,End Time,Summary
"1209396600","1209429000","some event"
"1226163600","1226206800","another event"

补充说明:

1) 多亏了@merlin2011,现在这似乎能满足我的需求,但有没有人能把这行代码简化一下?

def mdb_to_datetime(ts):
    return np.datetime64(datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M'))

2) 有没有其他人觉得文档有问题,因为里面没有提到自定义日期格式化函数应该返回np.datetime64

1 个回答

1

来回答你的问题:

2) 自定义的日期格式化器不一定要返回 np.datetime64,只要返回类似日期时间的格式就可以了(文档上说的是:“把字符串转换成日期时间实例”)。所以 datetime.datetime 是可以的,不需要把它转换成字符串。

1) 这也回答了第一个问题,你可以通过省略 strftime 来简化:

def mdb_to_datetime(ts):
    return datetime.fromtimestamp(float(ts))

你还可以使用 pandas 的 to_datetime 函数: pd.to_datetime(ts, unit='s')

撰写回答