最近,我遇到了一个非常奇怪的csv文件,其中包含2列(带有标题),其中一个用于日期,第二个用于价格。时间格式为“ dd.mm.yyyy”。
d = {'Date': [31.12.1991, 02.01.1992, 03.01.1992, 06.01.1992],
'Prices': [9.62, 9.5, 9.73, 9.45]}
df = pd.DataFrame(data=d)
prices = pd.DataFrame(df['Prices'])
date = pd.DataFrame(df['Date'])
date = date.to_string(header=True)
date = df.to_datetime(utc=True, infer_datetime_format=True)
frame = date.join(values)
print(df)
我试图通过隔离date列,然后尝试先使用to_string()函数将其转换为字符串,然后使用to_datetime返回到日期来使其工作,但这没有用。
有什么建议吗? 预先感谢
答案 0 :(得分:5)
注意:此操作使用errors='ignore'
来跳过可能不适合作为日期解析的列。但是,要权衡的是,如果有一个列打算被解析为日期,但具有错误的日期值,则此方法将使该列保持不变。关键是要确保您没有错误的日期值。
df.assign(
**df.select_dtypes(exclude=[np.number]).apply(
pd.to_datetime, errors='ignore', dayfirst=True
)
)
Date Prices
0 1991-12-31 9.62
1 1992-01-02 9.50
2 1992-01-03 9.73
3 1992-01-06 9.45
另一个例子
df = pd.DataFrame(dict(
A=1, B='B', C='6.7.2018', D=1-1j,
E='1.2.2017', F=pd.Timestamp('2016-08-08')
), [0])
df
A B C D E F
0 1 B 6.7.2018 (1-1j) 1.2.2017 2016-08-08
df.assign(
**df.select_dtypes(exclude=[np.number]).apply(
pd.to_datetime, errors='ignore', dayfirst=True
)
)
A B C D E F
0 1 B 2018-07-06 (1-1j) 2017-02-01 2016-08-08
从jezrael借来的
d = {'Date': ['31.12.1991', '02.01.1992', '03.01.1992', '06.01.1992'],
'Prices': [9.62, 9.5, 9.73, 9.45]}
df = pd.DataFrame(data=d)
答案 1 :(得分:3)
我认为需要:
d = {'Date': ['31.12.1991', '02.01.1992', '03.01.1992', '06.01.1992'],
'Prices': [9.62, 9.5, 9.73, 9.45]}
df = pd.DataFrame(data=d)
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
print (df)
Date Prices
0 1991-12-31 9.62
1 1992-01-02 9.50
2 1992-01-03 9.73
3 1992-01-06 9.45
答案 2 :(得分:3)
您可以在读取文件时尝试解析日期。您可以指定格式为第一天而不是月份。
import pandas as pd
df = pd.read_csv('test.csv', parse_dates=['Date'], dayfirst=True)
print(df)
# Date Prices
#0 1991-12-31 9.62
#1 1992-01-02 9.50
#2 1992-01-03 9.73
#3 1992-01-06 9.45
df.dtypes
#Date datetime64[ns]
#Prices float64
#dtype: object
但是,您的数据确实需要清洁和正确格式化才能起作用:
parse_dates:
- 如果列或索引包含不可解析的日期,请整列 或索引将按原样返回为对象数据类型。对于 非标准日期时间解析,请在pd.read_csv之后使用pd.to_datetime
样本数据:test.csv
Date,Prices
31.12.1991,9.62
02.01.1992,9.5
03.01.1992,9.73
06.01.1992,9.45