Python 固定日期字符串,其中日期和月份在某些行中互换

Python 固定日期字符串,其中日期和月份在某些行中互换,python,pandas,datetime,Python,Pandas,Datetime,我试图从csv文件上传一些数据,并找到日期和月份的值进行交换 以下是数据的外观: id,date 1001,09/10/2018 1002,20/09/2018 1003,09/05/2018 所有的日期都是从9月份开始的,但可以看出,它们以不同的格式互换。我正在使用下面的转换为datetime df['date'] = pd.to_datetime(df['date']).dt.strftime('%d/%m/%Y') 我已经想出了一个巧妙的小技巧,使用str.extract和pd.to_

我试图从csv文件上传一些数据,并找到日期和月份的值进行交换

以下是数据的外观:

id,date
1001,09/10/2018
1002,20/09/2018
1003,09/05/2018
所有的日期都是从9月份开始的,但可以看出,它们以不同的格式互换。我正在使用下面的转换为datetime

df['date'] = pd.to_datetime(df['date']).dt.strftime('%d/%m/%Y')

我已经想出了一个巧妙的小技巧,使用
str.extract
pd.to_datetime
来快速有效地执行此操作:

m = df.date.str.extract(r'(?:(09)/(\d+))')[1].astype(int) > 31
df['date'] = [
    pd.to_datetime(d, dayfirst=m) for d, m in zip(df.date, m)]

     id       date
0  1001 2018-09-10
1  1002 2018-09-20
2  1003 2018-09-05

Pandas在处理您的样本数据时没有问题,因为它显然与
'20/09/2018'
的情况不同,
20
不可能是Pandas处理的一个月

但是,如果输入包含例如
'10/09/2018'
(如评论中所述),则无法区分日期和月份,除非假定美国符号或事先知道绝对所有日期都在9月

既然后者似乎是这样,你可以这样做

df['date'].map(lambda x: pd.datetime(x.year, x.day, x.month)
               if (x.month != 9) & (x.day == 9)
               else x)


++先生,我想要好的密码。当我运行此代码时,您能在这里帮助我吗(从OP的示例创建df并使用
pd.readclipboard()
命令后,我得到了类似
AttributeError的错误:'DataFrame'对象没有属性“date”
。如果您能在这里提供帮助,我将不胜感激。当我执行
df.columns
时,我将获得
索引([u'id,date'],dtype='object')
这一个。@coldspeed,谢谢你的回复。.我仍然看到月/日列interchanged@RavinderSingh13尝试运行
df=pd.read_剪贴板(sep=',')
@hellokee我认为你做得不对。复制粘贴原样的代码;并确保结果被分配回来。不确定我能做更多。m=df.ref_date.str.extract(r'(?:(09)/(\d+)))[1]。astype(int)>31 df['ref_date']=[pd.to_datetime(d,dayfirst=m)for d,m in zip(df.ref_date,m)]df您希望您的数据是什么样子的?示例数据是df中给定的数据还是期望的输出?如果我只是读取数据,如``pd.to_datetime()所示`它正确地显示了所有日期都在9月的数据。@Scotty1-如果第二行是2018年9月10日呢?你认为这仍然有效吗?@coldspeed Right,明白了。没有考虑到这种可能性。。。
0   2018-09-10
1   2018-09-20
2   2018-09-05