转换Pandas数据帧中的日期/时间列

时间:2016-09-02 08:42:19

标签: python pandas

我的数据集包含各列中的日期(Julian日,第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']})

2 个答案:

答案 0 :(得分:3)

不确定我是否遗漏了一些东西,但这似乎有效:

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

答案 1 :(得分:1)

这些方面有什么用处吗? :

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参数解包