Python 如何将dataframe中的列转换为datatime?

Python 如何将dataframe中的列转换为datatime?,python,python-3.x,pandas,datetime,Python,Python 3.x,Pandas,Datetime,我有一个csv文档,示例如下: oci,citing,cited,creation,timespan,journal_sc,author_sc 0200100000236252421370109080537010700020300040001-020010000073609070863016304060103630305070563074902,"10.1002/pol.1985.170230401","10.1007/978-1-4613-3575-7_2",1985-04,P2Y,no,no

我有一个csv文档,示例如下:

oci,citing,cited,creation,timespan,journal_sc,author_sc
0200100000236252421370109080537010700020300040001-020010000073609070863016304060103630305070563074902,"10.1002/pol.1985.170230401","10.1007/978-1-4613-3575-7_2",1985-04,P2Y,no,no
共有2列,表示日期,我想将列类型从字符串更改为
datetime
格式

创建
(字符串)是创建日期,除未指定外,还可以用三种形式表示:

  • “yyyy-mm-dd”(例如“2019-09-20”)
  • “yyyy-mm”(例如“2019-09”)
  • “yyyy”(例如“2019年”)
  • timespan
    (字符串):根据
    PnYnMnD
    的形式表示,其中
    p
    是一个启动表达式的文本值,
    nY
    是年数,后跟一个文本
    Y
    nM
    是月数,后跟一个文本
    M
    nD
    是后跟文字
    D
    的天数,如果这些数字和相应的指示符等于0,则其中任何一个都可能不存在。
    P
    前面可能会出现减号,表示持续时间为负数

    我正在尝试使用
    pd.to_datetime()
    函数将列类型从字符串更改为
    datetime
    格式:

    def do_process(f_path):
        global my_ocan
    
        my_ocan = pd.read_csv(f_path, names=['oci', 'citing', 'cited', 'creation', 'timespan', 'journal_sc', 'author_sc'], parse_dates = ['creation', 'timespan'])
        my_ocan['timespan'] = pd.to_datetime(my_ocan['timespan'], format='%Y%m%d', errors='ignore', yearfirst=True)
        my_ocan['creation'] = pd.to_datetime(my_ocan['creation'], format='%Y%m%d', errors='ignore', yearfirst=True)
        #print(my_ocan['citing'])
        print(my_ocan.info())
    
        return my_ocan
    
    执行
    print(my_ocan.info())
    时,我得到的是“214非空对象”,而不是
    datetime
    。我错过了什么?有什么问题吗

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 214 entries, 0 to 213
    Data columns (total 7 columns):
    oci           214 non-null object
    citing        214 non-null object
    cited         214 non-null object
    creation      214 non-null object
    timespan      214 non-null object
    journal_sc    214 non-null object
    author_sc     214 non-null object
    dtypes: object(7)
    
    
    范围索引:214个条目,0到213
    数据列(共7列):
    OCI214非空对象
    引用214非空对象
    引用214非空对象
    创建214非空对象
    timespan 214非空对象
    日志\u sc 214非空对象
    author_sc 214非空对象
    数据类型:对象(7)
    

    谢谢大家,祝大家今天愉快:)

    代码中有几个问题需要解决

    首先,请注意,在
    .csv
    文件中,第一列是:

    oci,citing,cited,creation,timespan,journal_sc,author_sc
    
    因此,当您使用
    pd.read\u csv
    构建数据库时,数据帧的第一行将是
    .csv
    文件的第一行。最终,您的数据帧是:

                                                     oci  ...  author_sc
    0                                                oci  ...  author_sc
    1  0200100000236252421370109080537010700020300040...  ...         no
    
    而不是:

    [2 rows x 7 columns]
                                                     oci  ... author_sc
    1  0200100000236252421370109080537010700020300040...  ...        no
    
    我想你不想那样

    您还可以使用
    pd.to\u datetime
    来抑制错误,这并不好。删除
    errors='ignore'
    后,您会注意到转换到
    datetime
    失败,因为输入与
    '%Y%m%d'
    格式不匹配

    当然不会,因为您的
    创建
    列是:

    0    creation
    1     1985-04
    
    第一行是
    “creation”
    ,它与
    “%Y%m%d”
    不匹配

    其次,日期格式应该是
    “%Y-%m-%d”
    ,因为日期是YYYY-MM-DD格式,而不是YYYYMMDD格式。 (请小心,因为如果格式中有天,而输入没有天,则会在日期中添加一天)

    第三,
    timespan
    值不是日期,它们是句点(如果我没有弄错的话,这是一个Java句点),因此对它们使用
    pd.to_datetime
    是行不通的。我还没有找到一个python函数来为您进行转换,因此您可能需要自己以一种很好的老式字符串解析方式来完成这项工作,或者深入研究python库

    第四,正如上面所说的,
    pd.to_datetime
    已被弃用,因此您最好远离它,使用类似的功能,例如
    datetime.strtime

    最后,这里是代码的工作版本:

     def do_process(f_path):
         global my_ocan
    
         my_ocan = pd.read_csv(f_path, names=['oci', 'citing', 'cited', 'creation', 'timespan', 'journal_sc', 'author_sc'], parse_dates = ['creation', 'timespan'])
         my_ocan = my_ocan.iloc[1:]  # to remove the first row
         my_ocan['creation'] = pd.to_datetime(my_ocan['creation'], format="%Y-%m-%d", yearfirst=True)
         # Period parsing on my_ocan['timespan']
         print(my_ocan.info())
    
         return my_ocan
    
    哪些产出:

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 1 entries, 1 to 1
    Data columns (total 7 columns):
    oci           1 non-null object
    citing        1 non-null object
    cited         1 non-null object
    creation      1 non-null datetime64[ns]
    timespan      1 non-null object
    journal_sc    1 non-null object
    author_sc     1 non-null object
    dtypes: datetime64[ns](1), object(6)
    
    
    范围索引:1个条目,1到1
    数据列(共7列):
    oci 1非空对象
    引用1个非空对象
    引用1个非空对象
    创建1非空datetime64[ns]
    timespan 1非空对象
    日志SC1非空对象
    author\u sc 1非空对象
    数据类型:datetime64[ns](1),对象(6)
    

    请注意,
    creation
    的类型为
    datetime64[ns]
    now。

    问题在于“creation”列的输入类型有多种。它尝试将其转换为datetime类型,但由于存在不同的传入值,因此无法将其转换为datetime类型。它将其转换为对象。您可以将collumn强制转换回datetime,但它会删除您的值。您可以使用类似于
    myocan.astype({'creation':'datetime64[ns]}).dtypes
    的东西将其转换为datetime类型。克里斯,非常感谢您的详细解释,并将我的想法引导到正确的轨道上!:)