【问题标题】:read_csv convert date in 3 columns to 1 column date format like YYYY-MM-DD using pandas in Pythonread_csv 使用 Python 中的 pandas 将 3 列中的日期转换为 1 列日期格式,如 YYYY-MM-DD
【发布时间】:2013-03-24 14:08:20
【问题描述】:

使用以下代码:

import pandas as pd

date_spec = {'transdate': [[0, 1, 2]]}
df2 = pd.read_csv('fruit.csv', header=None, parse_dates=date_spec)

print df2

我正在尝试读取如下所示的 csv 文件:

2011,1,10,Apple,Red,1500,
2011,1,13,Apple,Green,1500,
2011,1,13,Orange,Red,4000,
2011,1,26,Banana,Red,1000,
2011,2,2,Pear,Green,4000,
2011,2,10,Pear,Red,4000,
2011,3,3,Banana,Green,1000,
2011,3,3,Orange,Green,2200,
2011,6,3,Orange,Green,3300,

放入一个如下所示的 Numpy 数组:

2011-01-10,Apple,Red,1500
2011-01-13,Apple,Blue,1500
2011-01-13,Orange,Red,4000
2011-01-26,Banana,Red,1000
2011-02-02,Pear,Blue,4000
2011-02-10,Pear,Red,4000
2011-03-03,Banana,Blue,1000
2011-03-03,Orange,Blue,2200
2011-06-03,Orange,Blue,3300

但我的打印输出如下所示:

     X.1  X.2  X.3   X.4   X.5   X.6  X.7
0   2011    1   10  Apple  Red  1500  NaN
1   2011    1   13  Apple  Blue 1500  NaN
2   2011    1   13  Orange Red  4000  NaN
3   2011    1   26  Banana Red  1000  NaN
4   2011    2    2  Pear   Blue 4000  NaN
5   2011    2   10  Pear   Red  4000  NaN
6   2011    3    3  Banana Blue 1000  NaN
7   2011    3    3  Orange Blue 2200  NaN
8   2011    6    3  Orange Blue 3300  NaN

我尝试了几种变体,但无法将 3 列中的日期转换为 1 列日期,格式为“YYYY-MM-DD”。非常感谢您提供任何帮助。

【问题讨论】:

    标签: python-2.7 numpy pandas


    【解决方案1】:

    读完csv,建立自己的date专栏:

    In [59]: df['date'] = df.apply(lambda x:datetime.date(x[0],x[1], x[2]), axis=1)
    
    In [60]: df
    Out[60]: 
          0  1   2       3      4     5   6        date
    0  2011  1  10   Apple    Red  1500 NaN  2011-01-10
    1  2011  1  13   Apple  Green  1500 NaN  2011-01-13
    2  2011  1  13  Orange    Red  4000 NaN  2011-01-13
    3  2011  1  26  Banana    Red  1000 NaN  2011-01-26
    4  2011  2   2    Pear  Green  4000 NaN  2011-02-02
    5  2011  2  10    Pear    Red  4000 NaN  2011-02-10
    6  2011  3   3  Banana  Green  1000 NaN  2011-03-03
    7  2011  3   3  Orange  Green  2200 NaN  2011-03-03
    8  2011  6   3  Orange  Green  3300 NaN  2011-06-03
    

    然后删除无用的列:

    In [61]: del df[0], df[1], df[2]
    
    In [62]: df
    Out[62]: 
            3      4     5   6        date
    0   Apple    Red  1500 NaN  2011-01-10
    1   Apple  Green  1500 NaN  2011-01-13
    2  Orange    Red  4000 NaN  2011-01-13
    3  Banana    Red  1000 NaN  2011-01-26
    4    Pear  Green  4000 NaN  2011-02-02
    5    Pear    Red  4000 NaN  2011-02-10
    6  Banana  Green  1000 NaN  2011-03-03
    7  Orange  Green  2200 NaN  2011-03-03
    8  Orange  Green  3300 NaN  2011-06-03
    

    【讨论】:

      【解决方案2】:

      read_csvparse_dates 参数应该是值在list 中的字典(不是列表列表):

      date_spec = {'transdate': [0, 1, 2]}  # a list
      
      df2 = pd.read_csv('fruit.csv', header=None, parse_dates=date_spec)
      
      In [3]: del df2[6]  # Note in 0.11 this may not be needed
      
      In [4]: df2
      Out[4]: 
                        foo       3      4     5
      0 2011-01-10 00:00:00   Apple    Red  1500
      1 2011-01-13 00:00:00   Apple  Green  1500
      2 2011-01-13 00:00:00  Orange    Red  4000
      3 2011-01-26 00:00:00  Banana    Red  1000
      4 2011-02-02 00:00:00    Pear  Green  4000
      5 2011-02-10 00:00:00    Pear    Red  4000
      6 2011-03-03 00:00:00  Banana  Green  1000
      7 2011-03-03 00:00:00  Orange  Green  2200
      8 2011-06-03 00:00:00  Orange  Green  3300
      

      【讨论】:

      • 我觉得这个比我的好。但是,当我阅读 cdv 时,如何截断时间信息?有可能吗?
      • @waitingkuo 这是一个有趣的问题,(我认为)时间戳在索引中抑制它,但不是在列中......:s
      • @waitingkuo 那只是因为时间都是午夜df2.set_index('transdate'),我认为它应该在列中显示相同...如果你还没有修复它,我会调查它: )
      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 2017-06-24
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      相关资源
      最近更新 更多