我正在读取超过14000行的文本文件中的数据,并且其中有一个列中包含八(08)位数字。某些行的格式如下:
问题是,当我使用to_date函数时,它会将日期的数据类型从object转换为int64,但我希望它是datetime。其次,使用to_datetime函数,日期如
答案 0 :(得分:3)
您可以将参数dtype
添加到read_csv
,以便将列col
转换为string
,然后使用带有参数format
的{{3}}来指定格式和errors='coerce'
- 因为错误的日期转换为NaT
:
import pandas as pd
import io
temp=u"""col
01021943
02031944
00041945
00001946"""
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp), dtype={'col': 'str'})
df['col'] = pd.to_datetime(df['col'], format='%d%m%Y', errors='coerce')
print (df)
col
0 1943-02-01
1 1944-03-02
2 NaT
3 NaT
print (df.dtypes)
col datetime64[ns]
dtype: object
感谢to_datetime
提供另一种解决方案:
import pandas as pd
import io
temp=u"""col_name
01021943
02031944
00041945
00001946"""
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp),
converters={'col_name': lambda dt: pd.to_datetime(dt, format='%d%m%Y', errors='coerce')})
print (df)
col_name
0 1943-02-01
1 1944-03-02
2 NaT
3 NaT
print (df.dtypes)
col_name datetime64[ns]
dtype: object
答案 1 :(得分:1)
作为第一个猜测解决方案,您可以将其作为字符串解析为日期时间实例。类似的东西:
from datetime import datetime
EXAMPLE = u'01021943'
dt = datetime(int(EXAMPLE[4:]), int(EXAMPLE[2:4]), int(EXAMPLE[:2]))
......不太关心性能问题。
答案 2 :(得分:1)
import datetime
def to_date(num_str):
return datetime.datetime.strptime(num_str,"%d%m%Y")
请注意,这也会抛出零值的异常,因为此输入的预期行为不明确
如果您想要零值的不同行为,可以使用try & except
,
实现它
例如,如果您希望None
为零值,则可以执行以下操作:
def to_date(num_str):
try:
return datetime.datetime.strptime(num_str,"%d%m%Y")
except ValueError, e:
return None