你可以转换大熊猫' datetime对象非常容易在列上使用apply(),但我遇到的问题是它真的很慢。
我正在尝试开发另一种解决方案,但我一直在遇到性能障碍。
我目前的解决方案是:
def modify_date2(x):
"""
applies datetime mask 1 of MM YYYY to the data
Example: 01 2016
"""
try:
if pd.isnull(x) == False:
return x.strftime('%m %Y')
else:
return pd.NaT
except:
return pd.NaT
df['columnname'] = df['columnname'].apply(modify_date2)
对于大约700K记录,需要3分钟,这只是我的生产数据集的一个子集,即2300万条记录。你看到了我的担忧。
我正在尝试这个:
df.ix[pd.notnull(df['sourcedt']), "sourcedt"] = \
datetime.fromtimestamp(mktime(df['sourcedt'].dt.timetuple()))
但我不能在'系列'上进行低级转换。根据我收到的错误消息。查询工作正常,我可以使用pd.notnull()没有问题,但值的设置是我的问题。
关于如何加快速度的任何想法? 我的源数据正在使用pd.DataFrame.from_records()加载。
我正在使用Pandas 0.16.1,Python 2.7.10
谢谢
答案 0 :(得分:1)
IIUC你可以使用dt.strftime
,columnname
的dtype是datetime
:
print (df)
text columnname
0 a 2016-06-13 18:00:00
1 b NaT
2 c 2016-07-11 19:07:00
3 d 2016-07-11 19:07:00
4 e 2016-08-01 16:00:00
print (df['columnname'].dt.strftime('%m %Y'))
0 06 2016
1 NaT
2 07 2016
3 07 2016
4 08 2016
Name: columnname, dtype: object
如果首先需要转换为日期时间并且某些日期已损坏,请使用to_datetime
:
df['columnname'] = pd.to_datetime(df['columnname'], errors='coerce').dt.strftime('%m %Y')
样品:
df = pd.DataFrame({'columnname': {0: '2016-06-13 18:00', 1: np.nan, 2: 'dd', 3: '2016-07-11 19:07', 4: '2016-08-01 16:00'}, 'text': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'}})
print (df)
columnname text
0 2016-06-13 18:00 a
1 NaN b
2 dd c
3 2016-07-11 19:07 d
4 2016-08-01 16:00 e
df['columnname'] = pd.to_datetime(df['columnname'], errors='coerce').dt.strftime('%m %Y')
print (df)
columnname text
0 06 2016 a
1 NaT b
2 NaT c
3 07 2016 d
4 08 2016 e