Python 如何将dataframe中的列转换为datatime?
我有一个csv文档,示例如下: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
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
格式
列创建
(字符串)是创建日期,除未指定外,还可以用三种形式表示:
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类型。克里斯,非常感谢您的详细解释,并将我的想法引导到正确的轨道上!:)