如果日期字符串的格式不同,则将字符串转换为python中的日期

时间:2019-06-28 09:40:09

标签: python pandas numpy datetime string-to-datetime

我的数据的日期变量具有两种不同的日期格式

Date
01 Jan 2019
02 Feb 2019
01-12-2019
23-01-2019
11-04-2019
22-05-2019

我想将此字符串转换为日期(YYYY-mm-dd)

Date
2019-01-01
2019-02-01
2019-12-01
2019-01-23
2019-04-11
2019-05-22

我尝试了以下操作,但是我正在寻找更好的方法

df['Date'] = np.where(df['Date'].str.contains('-'), pd.to_datetime(df['Date'], format='%d-%m-%Y'), pd.to_datetime(df['Date'], format='%d %b %Y'))

为我工作的解决方案

df['Date_1']= np.where(df['Date'].str.contains('-'),df['Date'],np.nan)
df['Date_2']= np.where(df['Date'].str.contains('-'),np.nan,df['Date'])
df['Date_new'] = np.where(df['Date'].str.contains('-'),pd.to_datetime(df['Date_1'], format = '%d-%m-%Y'),pd.to_datetime(df['Date_2'], format = '%d %b %Y'))

4 个答案:

答案 0 :(得分:1)

只需使用选项dayfirst=True

pd.to_datetime(df.Date, dayfirst=True)

Out[353]:
0   2019-01-01
1   2019-02-02
2   2019-12-01
3   2019-01-23
4   2019-04-11
5   2019-05-22
Name: Date, dtype: datetime64[ns]

答案 1 :(得分:0)

我的建议: 定义转换函数,如下所示:

import datetime as dt

def conv_date(x):
    try:
        res = pd.to_datetime(dt.datetime.strptime(x, "%d %b %Y"))
    except ValueError:
        res = pd.to_datetime(dt.datetime.strptime(x, "%d-%m-%Y"))
    return res

现在获取新的日期列,如下所示:

df['Date_new'] = df['Date'].apply(lambda x: conv_date(x))

答案 2 :(得分:0)

这完全符合预期-

<!DOCTYPE html>
<html>
<head>
    <title>MURO - service add panel</title>
    <link href="../../css/admin.css?v=<?php echo $timestamp;?>" rel="stylesheet" type="text/css">
    <script src="../../script/main.js?v=<?php echo $timestamp;?>"></script>
</head>
<body>
    <div id="topbar">
        <a href="#"><img src="../../img/logo.png"></a>
        <p><a href="../functions/logout.php">Log Out</a></p>
        <p>Welcome: <?php echo $login_session; ?></p>
    </div>
    <div id="sidebar">
        <ul>
            <li><a href="../admin_dashboard.php">Dashboard</a></li>
            <li><a href="../about/about.php">About</a></li>
            <li class="active"><a href="products.php">Services</a></li>
            <li><a href="../users/users.php">Users</a></li>
        </ul>
    </div>
    <div id="mainContent">
        <form method="post" id="editServices"  enctype="multipart/form-data" name="servicesForm" onsubmit="return validateAddServices()">
            <h3>Add new service</h3>
            <label>Name:</label><span class="error" id="namespan"><?php echo $errName; ?></span><br>
            <input type="text" name="name" placeholder="Enter title"><br>
            <label>Description:</label><span class="error" id="descspan"><?php echo $errDescription; ?></span><br>
            <textarea name="description" id="text" placeholder="Type your description..."></textarea><br>
            <label>Category</label><span class="error" id="categoryspan"><?php echo $errCategory; ?></span><br>
            <input type="number" name="category_id" placeholder="price of the product(num)"><br>
            <label>Price</label><span class="error" id="pricespan"><?php echo $errPrice; ?></span><br>
            <input type="number" name="price" placeholder="price of the product(num)"><br>
            <label>Photo:</label><span class="error" id="photospan"><?php echo $errPhoto; ?></span><br>
            <input type="file" name="fileToUpload" accept="image/*"><br>
            <input type="submit" name="submit" value="Submit">
        </form>
    </div>
</body>
</html> 

答案 3 :(得分:0)

您可以借助applyto_datetime大熊猫方法来获得所需的结果,如下所示:-

import pandas pd

def change(value):
    return pd.to_datetime(value)

df = pd.DataFrame(data = {'date':['01 jan 2019']})

df['date'] = df['date'].apply(change)
df

希望对您有帮助。