将datetime64列拆分为pandas dataframe中的日期和时间列

时间:2014-02-16 13:20:30

标签: python pandas

如果我的数据框的第一列是datetime64列。如何将此列拆分为2个新列,一个日期列和一个时间列。到目前为止,这是我的数据和代码:

DateTime,Actual,Consensus,Previous
20140110 13:30:00,74000,196000,241000
20131206 13:30:00,241000,180000,200000
20131108 13:30:00,200000,125000,163000
20131022 12:30:00,163000,180000,193000
20130906 12:30:00,193000,180000,104000
20130802 12:30:00,104000,184000,188000
20130705 12:30:00,188000,165000,176000
20130607 12:30:00,176000,170000,165000
20130503 12:30:00,165000,145000,138000
20130405 12:30:00,138000,200000,268000
...


import pandas as pd
nfp = pd.read_csv("NFP.csv", parse_dates=[0])
nfp

给出:

Out[10]: <class 'pandas.core.frame.DataFrame'>
         Int64Index: 83 entries, 0 to 82
         Data columns (total 4 columns):
         DateTime     82  non-null values
         Actual       82  non-null values
         Consensus    82  non-null values
         Previous     82  non-null values
         dtypes: datetime64[ns](1), float64(3)

一切都很好,但不知道该怎么做。

具体而言我不确定两点:

  1. 当我首先阅读csv文件时,是否可以这样做?如果是这样,怎么样?
  2. 一旦我执行了csv_read,任何人都可以帮我告诉我如何进行拆分吗?
  3. 还有什么地方可以查找这类信息吗?

    很难找到类库的详细参考谢谢!

1 个答案:

答案 0 :(得分:27)

如何将CSV直接解析为所需的DataFrame:

将函数的dict传递给pandas.read_csv的{​​{1}}关键字参数:

converters

产量

import pandas as pd
import datetime as DT
nfp = pd.read_csv("NFP.csv", 
                  sep=r'[\s,]',              # 1
                  header=None, skiprows=1,
                  converters={               # 2
                      0: lambda x: DT.datetime.strptime(x, '%Y%m%d'),  
                      1: lambda x: DT.time(*map(int, x.split(':')))},
                  names=['Date', 'Time', 'Actual', 'Consensus', 'Previous'])

print(nfp)
  1. Date Time Actual Consensus Previous 0 2014-01-10 13:30:00 74000 196000 241000 1 2013-12-06 13:30:00 241000 180000 200000 2 2013-11-08 13:30:00 200000 125000 163000 3 2013-10-22 12:30:00 163000 180000 193000 4 2013-09-06 12:30:00 193000 180000 104000 5 2013-08-02 12:30:00 104000 184000 188000 6 2013-07-05 12:30:00 188000 165000 176000 7 2013-06-07 12:30:00 176000 170000 165000 8 2013-05-03 12:30:00 165000 145000 138000 9 2013-04-05 12:30:00 138000 200000 268000 告诉sep=r'[\s,]'分割csv的行 正则表达式模式read_csv - 空格或逗号。
  2. r'[\s,]'参数告诉converters应用给定的 功能到某些列。密钥(例如0和1)指的是 列索引,值是要应用的函数。

  3. 如何在执行csv_read后拆分DataFrame

    read_csv

    哪个更快?

    取决于CSV的大小。 (感谢Jeff指出这一点。)

    对于小型CSV,直接将CSV解析为所需形式比使用import pandas as pd nfp = pd.read_csv("NFP.csv", parse_dates=[0], infer_datetime_format=True) temp = pd.DatetimeIndex(nfp['DateTime']) nfp['Date'] = temp.date nfp['Time'] = temp.time del nfp['DateTime'] print(nfp) 解析后使用DatetimeIndex更快:

    parse_dates=[0]

    但是,对于只有几百行或更多行的CSV,使用DatetimeIndex会更快。

    def using_converter():
        nfp = pd.read_csv("NFP.csv", sep=r'[\s,]', header=None, skiprows=1,
                          converters={
                              0: lambda x: DT.datetime.strptime(x, '%Y%m%d'),
                              1: lambda x: DT.time(*map(int, x.split(':')))},
                          names=['Date', 'Time', 'Actual', 'Consensus', 'Previous'])
        return nfp
    
    def using_index():
        nfp = pd.read_csv("NFP.csv", parse_dates=[0], infer_datetime_format=True)
        temp = pd.DatetimeIndex(nfp['DateTime'])
        nfp['Date'] = temp.date
        nfp['Time'] = temp.time
        del nfp['DateTime']
        return nfp
    
    In [114]: %timeit using_index()
    100 loops, best of 3: 1.71 ms per loop
    
    In [115]: %timeit using_converter()
    1000 loops, best of 3: 914 µs per loop
    

    我可以在哪里查找此类信息?

    1. 有时您可以在Pandas Cookbook
    2. 中找到示例
    3. 有时网络搜索或搜索Stackoverflow就足够了。
    4. 度过一个周末下雪,除了阅读之外无所事事 pandas documentation肯定也会有所帮助。
    5. 安装IPython。它有标签完成,如果你输入N = 20 filename = '/tmp/data' content = '''\ DateTime,Actual,Consensus,Previous 20140110 13:30:00,74000,196000,241000 20131206 13:30:00,241000,180000,200000 20131108 13:30:00,200000,125000,163000 20131022 12:30:00,163000,180000,193000 20130906 12:30:00,193000,180000,104000 20130802 12:30:00,104000,184000,188000 20130705 12:30:00,188000,165000,176000 20130607 12:30:00,176000,170000,165000 20130503 12:30:00,165000,145000,138000 20130405 12:30:00,138000,200000,268000''' def setup(n): header, remainder = content.split('\n', 1) with open(filename, 'w') as f: f.write('\n'.join([header]+[remainder]*n)) In [304]: setup(50) In [305]: %timeit using_converter() 100 loops, best of 3: 9.78 ms per loop In [306]: %timeit using_index() 100 loops, best of 3: 9.3 ms per loop 后 函数,它为您提供函数的文档字符串。这两个功能 真的可以帮助您快速反省Python对象。它还告诉你函数定义在哪个文件中(如果在纯Python中定义) - 这导致我...
    6. Reading the source code
    7. 坚持下去。你越了解就越容易。

      如果您给出了最好的镜头但仍无法找到答案,请在Stackoverflow上发布问题。您希望能够快速得到答案,并帮助其他人搜索同样的事情。