【问题标题】:Convert date/time columns in Pandas dataframe转换 Pandas 数据框中的日期/时间列
【发布时间】:2016-09-02 17:16:43
【问题描述】:

我的数据集在各个列中包含日期(儒略日,第 1 列)、小时(HHMM,第 2 列)和秒(第 3 列):

1  253  2300   0    2.9  114.4  18.42  21.17
1  253  2300  10   3.27  111.2  18.48  21.12
1  253  2300  20   3.22  111.3  18.49  21.09
1  253  2300  30   3.84  106.4  18.52     21
1  253  2300  40   3.75  104.4  18.53  20.85

我正在使用Pandas 读取文本文件:

columns = ['station','julian_day','hours','seconds','U','Ud','T','RH']
df = pd.read_table(file_name, header=None, names=columns, delim_whitespace=True)

现在我想将日期转换为更方便的日期,例如YYYY-MM-DD HH:MM:SS数据集中没有提供年份,但固定为 2001)。

我尝试使用parse_dates 将三列合二为一:

df = pd.read_table(file_name, header=None, names=columns, delim_whitespace=True, 
                   parse_dates={'datetime' : ['julian_day','hours','seconds']}) 

将三列转换为一个字符串:

In [38]: df['datetime'][0]
Out[38]: '253 2300 0'

接下来我尝试使用date_parser 转换它们;关注this post,使用类似:

date_parser = lambda x: datetime.datetime.strptime(x, '%j %H%M %s')

date_parser 本身可以工作,但我无法将它与read_table 结合使用,而且我几乎被困在这一点上。有没有简单的方法来实现转换?

完整的最小(不那么)工作示例:

import pandas as pd
import datetime
from io import StringIO

data_file = StringIO("""\
 1  253  2300   0    2.9  114.4  18.42  21.17
 1  253  2300  10   3.27  111.2  18.48  21.12
 1  253  2300  20   3.22  111.3  18.49  21.09
 1  253  2300  30   3.84  106.4  18.52     21
 1  253  2300  40   3.75  104.4  18.53  20.85
""")

date_parser = lambda x: datetime.datetime.strptime(x, '%j %H%M %S')

columns = ['station','julian_day','hours','seconds','U','Ud','T','RH']
df = pd.read_table(data_file, header=None, names=columns, delim_whitespace=True,\
                   parse_dates={'datetime' : ['julian_day','hours','seconds']})

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    不确定我是否遗漏了什么,但这似乎可行:

    import pandas as pd
    import datetime
    from io import StringIO
    
    data_file = StringIO("""\
     1  253  2300   0    2.9  114.4  18.42  21.17
     1  253  2300  10   3.27  111.2  18.48  21.12
     1  253  2300  20   3.22  111.3  18.49  21.09
     1  253  2300  30   3.84  106.4  18.52     21
     1  253  2300  40   3.75  104.4  18.53  20.85
    """)
    
    date_parser = lambda x: datetime.datetime.strptime(("2001 " + x), '%Y %j %H%M %S')
    
    columns = ['station','julian_day','hours','seconds','U','Ud','T','RH']
    df = pd.read_table(data_file, header=None, names=columns, delim_whitespace=True,\
                       date_parser = date_parser,parse_dates={'datetime' : ['julian_day','hours','seconds']})
    

    我只是在 read_table 中添加 date_parser 参数,并在解析函数中硬编码 2001

    【讨论】:

    • 现在我也不确定我(或曾经……)缺少什么,但这确实有效。我确定我尝试过这种方法,但肯定有错字或其他东西。无论如何,谢谢,它现在可以工作了!
    • 这是/曾经是我的(不完美的)现实生活中的数据集,正在/正在搞砸我。
    【解决方案2】:

    这些方法会起作用吗? :

    def merge_date(df, year='Year', month='Month', day='Day', hours='Hours', seconds='Seconds'):
        """
        * Function: merge_date 
        * Usage: merge_date(DataFrame, col_year, col_month, col_day) . . .
        * -------------------------------
        * This function returns Datetime in the format YYYY-MM-DD from
        * input of a dataframe with columns holding 'Year', 'Month', 'Day' 
        """
    
        df['DateTime'] = df[[year, month, day, hours, seconds]].apply(lambda s : datetime.datetime(*s),axis = 1)
        return df
    

    使用datetime.datetime 对每个数据框列进行参数解包

    【讨论】:

    • 类似这样的东西:df['datetime'].apply(date_parser) 确实可以作为后处理步骤,但在解析文件时立即执行此操作会更好
    猜你喜欢
    • 2018-09-01
    • 2022-01-19
    • 2022-11-30
    • 1970-01-01
    • 2013-10-14
    • 2018-11-12
    相关资源
    最近更新 更多