Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在同一列中显示不同格式的日期时间_Python_Pandas_Datetime - Fatal编程技术网

Python 在同一列中显示不同格式的日期时间

Python 在同一列中显示不同格式的日期时间,python,pandas,datetime,Python,Pandas,Datetime,我有一个熊猫数据框,它有两种不同格式的日期时间,例如: 3/14/2019 5:15:32 AM 2019-08-03 05:15:35 2019-01-03 05:15:33 2019-01-03 05:15:33 2/28/2019 5:15:31 AM 2/27/2019 11:18:39 AM 我尝试了各种格式,但出现了错误,如ValueError:未转换的数据仍然存在:AM 我希望格式为2019-02-28,并删除时间您可以使用pd.to_datetime().dt.strftim

我有一个熊猫数据框,它有两种不同格式的日期时间,例如:

3/14/2019 5:15:32 AM
2019-08-03 05:15:35
2019-01-03 05:15:33
2019-01-03 05:15:33
2/28/2019 5:15:31 AM
2/27/2019 11:18:39 AM

我尝试了各种格式,但出现了错误
,如ValueError:未转换的数据仍然存在:AM


我希望格式为2019-02-28,并删除时间

您可以使用
pd.to_datetime().dt.strftime()
高效地将整个列转换为datetime对象,然后转换为字符串,并智能地猜测日期格式:

df = pd.Series('''3/14/2019 5:15:32 AM
2019-08-03 05:15:35
2019-01-03 05:15:33
2019-01-03 05:15:33
2/28/2019 5:15:31 AM
2/27/2019 11:18:39 AM'''.split('\n'), name='date', dtype=str).to_frame()

print(pd.to_datetime(df.date).dt.strftime('%Y-%m-%d'))
如果这不能满足您的需要,则在将其转换为datetime对象时,您需要识别不同类型的格式并应用不同的设置:

# Classify date column by format type
df['format'] = 1
df.loc[df.date.str.contains('/'), 'format'] = 2
df['new_date'] = pd.to_datetime(df.date)

# Convert to datetime with two different format settings
df.loc[df.format == 1, 'new_date'] = pd.to_datetime(df.loc[df.format == 1, 'date'], format = '%Y-%d-%m %H:%M:%S').dt.strftime('%Y-%m-%d')
df.loc[df.format == 2, 'new_date'] = pd.to_datetime(df.loc[df.format == 2, 'date'], format = '%m/%d/%Y %H:%M:%S %p').dt.strftime('%Y-%m-%d')
print(df)

假设数据帧中的列名是
DatStr

成功的关键是正确的转换功能 应用于每个日期字符串:

def datCnv(src):
    return pd.to_datetime(src)
然后,要创建一个true date列,您只需调用:

df['Dat'] = df.DatStr.apply(datCnv)
打印数据帧时,结果是:

                  DatStr                 Dat
0   3/14/2019 5:15:32 AM 2019-03-14 05:15:32
1    2019-08-03 05:15:35 2019-08-03 05:15:35
2    2019-01-03 05:15:33 2019-01-03 05:15:33
3    2019-01-03 05:15:33 2019-01-03 05:15:33
4   2/28/2019 5:15:31 AM 2019-02-28 05:15:31
5  2/27/2019 11:18:39 AM 2019-02-27 11:18:39
请注意,
to_datetime
函数足够聪明,可以识别
每种情况下使用的实际日期格式。

请注意,列表中的第三个日期是2019年3月1日,而不是8月1日。格式为Y-d-m
df['Dat'] = df.DatStr.apply(datCnv)
                  DatStr                 Dat
0   3/14/2019 5:15:32 AM 2019-03-14 05:15:32
1    2019-08-03 05:15:35 2019-08-03 05:15:35
2    2019-01-03 05:15:33 2019-01-03 05:15:33
3    2019-01-03 05:15:33 2019-01-03 05:15:33
4   2/28/2019 5:15:31 AM 2019-02-28 05:15:31
5  2/27/2019 11:18:39 AM 2019-02-27 11:18:39