【问题标题】:In Pandas how do I convert a string of date strings to datetime objects and put them in a DataFrame?在 Pandas 中,如何将一串日期字符串转换为日期时间对象并将它们放入 DataFrame 中?
【发布时间】:2013-07-15 11:19:32
【问题描述】:
import pandas as pd
date_stngs = ('2008-12-20','2008-12-21','2008-12-22','2008-12-23')

a = pd.Series(range(4),index = (range(4)))

for idx, date in enumerate(date_stngs):
    a[idx]= pd.to_datetime(date)

此代码位产生错误:

TypeError:"'int' 对象不可迭代"

谁能告诉我如何将这一系列日期时间字符串作为 DateTime 对象放入 DataFrame 中?

【问题讨论】:

标签: python datetime pandas


【解决方案1】:

一个简单的解决方案涉及 Series 构造函数。您可以简单地将数据类型传递给dtype 参数。此外,to_datetime 函数现在可以接受一个字符串序列。

创建数据

date_strings = ('2008-12-20','2008-12-21','2008-12-22','2008-12-23')

所有三个产生相同的东西

pd.Series(date_strings, dtype='datetime64[ns]')
pd.Series(pd.to_datetime(date_strings))
pd.to_datetime(pd.Series(date_strings))

基准测试

@waitingkuo 提供的基准测试是错误的。第一种方法比其他两种方法慢一点,但性能相同。

import datetime as dt
dates = [(dt.datetime(1960, 1, 1)+dt.timedelta(days=i)).date().isoformat() 
         for i in range(20000)] * 100

%timeit pd.Series(dates, dtype='datetime64[ns]')
730 ms ± 9.06 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


%timeit pd.Series(pd.to_datetime(dates))
426 ms ± 3.45 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit pd.to_datetime(pd.Series(dates))
430 ms ± 5.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

【讨论】:

    【解决方案2】:
    >>> import pandas as pd
    >>> date_stngs = ('2008-12-20','2008-12-21','2008-12-22','2008-12-23')
    >>> a = pd.Series([pd.to_datetime(date) for date in date_stngs])
    >>> a
    0    2008-12-20 00:00:00
    1    2008-12-21 00:00:00
    2    2008-12-22 00:00:00
    3    2008-12-23 00:00:00
    

    更新

    使用 pandas.to_datetime(pd.Series(..))。它比上面的代码更简洁,速度更快。

    >>> pd.to_datetime(pd.Series(date_stngs))
    0   2008-12-20 00:00:00
    1   2008-12-21 00:00:00
    2   2008-12-22 00:00:00
    3   2008-12-23 00:00:00
    

    【讨论】:

    • pd.to_datetime(pd.Series(date_stngs)) 慢一百倍。强烈不推荐这种方法。
    • @DickEshelman,waitingkuo 的版本是更优雅的解决方案。
    • @waitingkuo,我同意你的版本更简洁。但是你的版本并不比我的快 100 倍。 timeit.timeit 我的,你的,差别很小。
    • @waitingkuo,我升级到 0.11.0。你是对的。真丢脸。
    • @FermionPortal,对我来说几乎一样。 (Python 2.7.8、pandas 0.14.1、Windows 7):pastebin.com/m1u9Prn6
    【解决方案3】:
    In [46]: pd.to_datetime(pd.Series(date_stngs))
    Out[46]: 
    0   2008-12-20 00:00:00
    1   2008-12-21 00:00:00
    2   2008-12-22 00:00:00
    3   2008-12-23 00:00:00
    dtype: datetime64[ns]
    

    更新:基准测试

    In [43]: dates = [(dt.datetime(1960, 1, 1)+dt.timedelta(days=i)).date().isoformat() for i in range(20000)]
    
    In [44]: timeit pd.Series([pd.to_datetime(date) for date in dates])
    1 loops, best of 3: 1.71 s per loop
    
    In [45]: timeit pd.to_datetime(pd.Series(dates))
    100 loops, best of 3: 5.71 ms per loop
    

    【讨论】:

    • 为什么你以datetime -> datetime 转换为基准,而不是str -> datetime
    • 对不起,我错过了。
    猜你喜欢
    • 2013-11-13
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2020-05-21
    相关资源
    最近更新 更多