我想知道pandas是否能够自动检测哪些列是datetime对象并以日期而不是字符串的形式读取这些列?
我正在查看api和相关的堆栈溢出帖子,但我似乎无法弄明白。
这是一个黑盒系统,在生产时接受任意csv架构,所以我不知道列名是什么。
这似乎可行,但您必须知道哪些列是日期字段:
import pandas as pd
#creating the test data
df = pd.DataFrame({'0': ['a', 'b', 'c'], '1': ['2015-12-27','2015-12-28', '2015-12-29'], '2': [11,12,13]})
df.to_csv('test.csv', index=False)
#loading the test data
df = pd.read_csv('test.csv', parse_dates=True)
print df.dtypes
# prints (object, object, int64) instead of (object,datetime, int64)
我在想如果它不能做到这一点,那么我可以写一些:
- 查找字符串类型的列。
- 抓住一些独特的值并尝试解析它们。
- 如果成功,则尝试解析整个列。
醇>
编辑。我写了一个简单的方法convertDateColumns
来执行此操作:
import pandas as pd
from dateutil import parser
def convertDateColumns(self, df):
object_cols = df.columns.values[df.dtypes.values == 'object']
date_cols = [c for c in object_cols if testIfColumnIsDate(df[c], num_tries=3)]
for col in date_cols:
try:
df[col] = pd.to_datetime(df[col], coerce=True, infer_datetime_format=True)
except ValueError:
pass
return df
def testIfColumnIsDate(series, num_tries=4):
""" Test if a column contains date values.
This can try a few times for the scenerio where a date column may have
a couple of null or missing values but we still want to parse when
possible (and convert those null/missing to NaD values)
"""
if series.dtype != 'object':
return False
vals = set()
for val in series:
vals.add(val)
if len(vals) > num_tries:
break
for val in list(vals):
try:
if type(val) is int:
continue
parser.parse(val)
return True
except ValueError:
pass
return False
答案 0 :(得分:11)
我会使用AlertDialog.Builder builder = new AlertDialog.Builder(mSettingsView.getBaseActivity());
builder.setTitle("Ringtone");
builder.setSingleChoiceItems(list, -1, listener1);
builder.setPositiveButton("OK", listener2);
builder.setNegativeButton("Cancel", listener3);
builder.show();
,并在不起作用的列上捕获异常。例如:
pd.to_datetime
我认为这与你可以获得的应用程序一样接近“自动”。
答案 1 :(得分:3)
您可以避免for
循环并使用参数errors='ignore'
来避免修改不需要的值。在下面的代码中,我们在所有对象列上应用to_datetime
转换(忽略错误)(其他列按原样返回)。
如果'忽略',则无效的解析将返回输入
df = df.apply(lambda col: pd.to_datetime(col, errors='ignore')
if col.dtypes == object
else col,
axis=0)
df.dtypes
# 0 object
# 1 datetime64[ns]
# 2 int64