更改熊猫的日期格式

时间:2017-01-25 13:34:24

标签: python date pandas lambda

我有以下csv数据

country,sale,date,trans_factor
India,403171,12/01/2012,1
Bhutan,394096,12/01/2012,2
Nepal,super,12/01/2012,3
madhya,355883,12/01/2012,4
sudan,man,12/01/2012,5

csv_data = pandas.read_csv(csv_file_data, skiprows=[0], names=original_csv_header, parse_dates=True, infer_datetime_format=True)

print csv_data

  country    sale        date  trans_factor
0   India  403171  12/01/2012             1
1  Bhutan  394096  12/01/2012             2
2   Nepal   super  12/01/2012             3
3  madhya  355883  12/01/2012             4
4   sudan     man  12/01/2012             5

即使在添加parse_dates=True之后,上述代码也没有将值从12/01/2012更改为2012-01-12,我也不知道为什么

我想格式化'%d/%m/%Y'格式的日期列,所以我尝试使用以下代码

dates = {
        'dd/mm/yy': "%d/%m/%Y",
        'mm/dd/yy': "%m/%d/%Y",
    }

def return_date_fromat(d, date_format):
    return datetime.datetime.strptime(d, date_format)


csv_data["date"] = csv_data["date"].apply(lambda d: return_date_fromat(d, dates['dd/mm/yy']))

基本上我正在使用lambda的另一个函数return_date_fromat,因为当我使用下面的

csv_data["date"] = csv_data["date"].apply(lambda d: datetime.datetime.strptime(d, dates['dd/mm/yy'])

我得到*** NameError: global name 'dates' is not defined因此我使用函数return_date_fromat作为lambda

最后如何格式化日期?

1 个答案:

答案 0 :(得分:0)

我认为您需要将参数parse_dates更改为[2],因为True表示解析DatetimeIndex,请参阅docs

  

parse_dates   :boolean或整数或名称列表或列表或dict列表,默认为False。

     

如果为真 - >尝试解析索引   如果[1,2,3] - >尝试将第1,2,3列分别解析为单独的日期列   如果[[1,3]] - >将第1列和第3列组合在一起并解析为单个日期列   如果{' foo' :[1,3]} - >将列1,3解析为日期并调用结果'foo'。 iso8601格式的日期存在快速路径。

import pandas as pd
import numpy as np
from pandas.compat import StringIO

temp=u"""country,sale,date,trans_factor
India,403171,12/01/2012,1
Bhutan,394096,12/01/2012,2
Nepal,super,12/01/2012,3
madhya,355883,12/01/2012,4
sudan,man,12/01/2012,5"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), parse_dates=[2])
#df = pd.read_csv(StringIO(temp), parse_dates=['date'])

print (df)
  country    sale       date  trans_factor
0   India  403171 2012-12-01             1
1  Bhutan  394096 2012-12-01             2
2   Nepal   super 2012-12-01             3
3  madhya  355883 2012-12-01             4
4   sudan     man 2012-12-01             5

print (df.dtypes)
country                 object
sale                    object
date            datetime64[ns]
trans_factor             int64
dtype: object

编辑:

如果需要自定义解析器添加参数date_parser

parser = lambda x: pd.datetime.strptime(x, '%d/%m/%Y')
df = pd.read_csv(StringIO(temp), parse_dates=[2], date_parser=parser)
print (df)
  country    sale       date  trans_factor
0   India  403171 2012-01-12             1
1  Bhutan  394096 2012-01-12             2
2   Nepal   super 2012-01-12             3
3  madhya  355883 2012-01-12             4
4   sudan     man 2012-01-12             5

但也有效dayfirst=True

df = pd.read_csv(StringIO(temp), parse_dates=[2], dayfirst=True)
print (df)
  country    sale       date  trans_factor
0   India  403171 2012-01-12             1
1  Bhutan  394096 2012-01-12             2
2   Nepal   super 2012-01-12             3
3  madhya  355883 2012-01-12             4
4   sudan     man 2012-01-12             5