使用Python将数字转换为日期格式

时间:2016-08-09 12:43:00

标签: python pandas python-datetime

我正在读取超过14000行的文本文件中的数据,并且其中有一个列中包含八(08)位数字。某些行的格式如下:

  • 01021943
  • 02031944
  • 00041945
  • 00001946

问题是,当我使用to_date函数时,它会将日期的数据类型从object转换为int64,但我希望它是datetime。其次,使用to_datetime函数,日期如

  • 00041945成为41945
  • 00001946变为1946年,因此我无法正确格式化它们

3 个答案:

答案 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