我有以下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
最后如何格式化日期?
答案 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