【问题标题】:Define date format in Python / Pandas在 Python / Pandas 中定义日期格式
【发布时间】:2016-09-26 10:38:14
【问题描述】:

我在 Python 中使用 Pandas 模块加入了两个 .csv 文件。一列是格式为“dd.mm.yyyy”的日期。

现在我想从中只提取月份(作为带有前导零的 2 位整数)以供进一步使用。

到目前为止,我已经完成了这项工作,但我不得不作弊。 Python 认为我得到的字符串是 DAY。我不喜欢半生不熟的东西,所以想问问社区我如何具体告诉 Python 日期的哪一部分是月份,以便可以返回给我?

这是我目前所拥有的:

import pandas

def saison(input):
    if input == "04" or input == "05" or input == "06" or input == "07" or input == "08" or input == "09":
        return "Sommer"
    else:
        return "Winter"

df_1 = pandas.read_csv("a.csv", sep=';', names=["DWD_ID", "Datum"], header=0)
df_2 = pandas.read_csv("b.csv", sep=';', names=[VEG", "DWD_ID"], header=0)
df_joined = pandas.merge(df_1, df_2, on="DWD_ID")
df_joined["Datum"] = pandas.to_datetime(df_joined["Datum"])

df_joined["Saison"] = saison(df_joined["Datum"].apply(lambda x: x.strftime('%d')))

如果我使用

x.strftime('%m') 

相反,它会在当天返回给我。

【问题讨论】:

    标签: python python-2.7 csv pandas


    【解决方案1】:

    您可以在 to_datetime 的 arg 中提供要保留的格式:

    pd.to_datetime(df['date_col'], format="%d.%m.%Y").dt.month.astype(str).str.zfill(2)
    

    【讨论】:

    • dayfirst=True 也可以,但format 会更快,并且会在出现问题时失败,而不是默默地做出您可能不同意的选择。
    • 干得不错!谢谢!
    • @Khaled,我看到您没有接受任何先前问题的答案,包括这个问题;-) 如果它解决了您的问题,您当然应该接受它们(通过单击复选标记)问题。这向将来访问此页面的任何人表明,我的这个解决方案可以解决问题。
    • 糟糕,抱歉,我还没有意识到这个功能!
    【解决方案2】:

    首先,您似乎在日期时间中交换了月份和日期,因此您需要将参数 format='%Y-%d-%m' 添加到 to_datetime (Python's strftime directives):

    df = pd.DataFrame({'Date': ['2016-24-02']})  
    print (df)
             Date
    0  2016-24-02
    
    print (pd.to_datetime(df.Date, format='%Y-%d-%m'))
    0   2016-02-24
    Name: Date, dtype: datetime64[ns]
    

    转换后就可以使用了:

    dt.strftime:

    print (df.Date.dt.strftime('%m'))
    

    提取month的另一个解决方案,然后转换为string,最后通过zfill添加零填充:

    print (df.Date.dt.month.astype(str).str.zfill(2))
    

    示例:

    start = pd.to_datetime('2015-02-24')
    rng = pd.date_range(start, periods=10, freq='m')
    
    df = pd.DataFrame({'Date': rng})  
    print (df)
            Date
    0 2015-02-28
    1 2015-03-31
    2 2015-04-30
    3 2015-05-31
    4 2015-06-30
    5 2015-07-31
    6 2015-08-31
    7 2015-09-30
    8 2015-10-31
    9 2015-11-30
    
    
    print (df.Date.dt.strftime('%m'))
    0    02
    1    03
    2    04
    3    05
    4    06
    5    07
    6    08
    7    09
    8    10
    9    11
    Name: Date, dtype: object
    

    print (df.Date.dt.month.astype(str).str.zfill(2))
    0    02
    1    03
    2    04
    3    05
    4    06
    5    07
    6    08
    7    09
    8    10
    9    11
    Name: Date, dtype: object
    

    最后你可以使用 numpy.whereisin 的条件:

    saison = ["04","05","06","07","08","09"]
    df['Saison'] = np.where(df.Date.dt.strftime('%m').isin(saison), 'Sommer','Winter')
    print (df)
            Date  Saison
    0 2015-02-28  Winter
    1 2015-03-31  Winter
    2 2015-04-30  Sommer
    3 2015-05-31  Sommer
    4 2015-06-30  Sommer
    5 2015-07-31  Sommer
    6 2015-08-31  Sommer
    7 2015-09-30  Sommer
    8 2015-10-31  Winter
    9 2015-11-30  Winter
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-20
      • 2012-08-05
      • 2017-08-10
      • 1970-01-01
      • 2020-06-15
      • 2011-12-06
      • 2014-08-17
      • 1970-01-01
      相关资源
      最近更新 更多