【问题标题】:Convert column 'day' to datetime with year specification使用年份规范将列“日”转换为日期时间
【发布时间】:2021-05-20 10:44:01
【问题描述】:

我有一个数据框,其中包含一列已知年份的日期:

print (df)
        year  day  time  
0       2012  227   800
15      2012  227   815
30      2012  227   830
...     ...   ...   ...
194250  2013  226  1645
194265  2013  226  1700

我尝试将日期数字转换为日期时间%m-%d,使用:

import pandas as pd    
df['day'] = pd.to_datetime(df['day'], format='%j').dt.strftime('%m-%d')

给出:

        year    day  time
0       2012  08-15   800
15      2012  08-15   815
30      2012  08-15   830
...     ...   ...     ...
194250  2013  08-14  1645
194265  2013  08-14  1700

但此转换不正确,因为 2012 年的第 227 天是 8 月 14 日 (08-14)。我相信这个错误是由于转换中缺少年份规范。

如何在转换中指定年份以获得 a) %Y-%m-%d ; b)%m-%d; c)%Y-%m-%dT%H:%M 来自我拥有的数据框?

谢谢

【问题讨论】:

    标签: python pandas dataframe datetime


    【解决方案1】:

    您可以转换为字符串并输入pd.to_datetime,并使用正确的解析指令提供:

    import pandas as pd
    
    df = pd.DataFrame({'year': [2012, 2012], 'day' : [227, 228], 'time': [800, 0]})
    
    df['datetime'] = pd.to_datetime(df.year.astype(str) + ' ' +
                                    df.day.astype(str) + ' ' +
                                    df.time.astype(str).str.zfill(4), 
                                    format='%Y %j %H%M')
    
    df['datetime']
    
    0   2012-08-14 08:00:00
    1   2012-08-15 00:00:00
    Name: datetime, dtype: datetime64[ns]
    

    格式化为字符串只是通过dt访问器调用strftime,例如

    df['datetime'].dt.strftime('%Y-%m-%dT%H:%M')
    
    0    2012-08-14T08:00
    1    2012-08-15T00:00
    Name: datetime, dtype: object
    

    【讨论】:

    • zfill(4) 的目的是将没有前导零的时间转换为有四位数字的时间(即包括前导零)?结合 QH 的代码,即使没有 zfill,您的代码也能正确给出所有时间。谢谢!
    • @R_Dax 完全是 :) 当我使用例如测试时它不起作用0 00:00 小时(即任何小于 3 位的数字),所以我添加了 zfill。
    • 好的,我明白了。也许在这种特定情况下对我来说很好,因为我的时间都至少有 3 位数字(即 (0)800 到 1700),但在未来时间格式少于 3 位数字的情况下它会有所帮助。谢谢! :)
    【解决方案2】:

    您可以尝试将year转换为datetime类型,将day转换为timedelta类型,记得偏移日期:

    dates = pd.to_datetime(df['year'], format='%Y') + \
            pd.to_timedelta(df['day'] -1, unit='D')  
    

    输出:

    0        2012-08-14
    15       2012-08-14
    30       2012-08-14
    194250   2013-08-14
    194265   2013-08-14
    dtype: datetime64[ns]
    

    然后用strftime提取日期-月份:

    df['day'] = dates.dt.strftime('%M-%D')
    

    【讨论】:

    • Quang Hoang 您的解决方案适用于解决整个 df 的日期时间问题,但错过了添加时间信息。 MrFuppes 的解决方案添加了时间信息,但我只能让它为一行工作,而不是整个 df。我合并了两种解决方案:QH 转换日期-> 日期,然后 MF 添加时间信息。非常感谢你们俩。抱歉,我似乎无法在评论中@任何人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2015-06-17
    • 1970-01-01
    • 2021-07-04
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多