【问题标题】:convert year, month columns to datetime in python, generate csv在python中将年、月列转换为日期时间,生成csv
【发布时间】:2018-06-23 05:25:03
【问题描述】:

我是 python 和 pandas 的新手,所以现在面临太多问题。无法使用 pandas 创建日期时间,并希望根据数据框中的给定数据创建 csv 文件。 我想将给定的列日期转换为单个日期时间,输出应该是 csv..

下面是我的代码:

    # -*- coding: utf-8 -*-
import pandas as pd
df = pd.DataFrame({
        'S.No.':[1,2,3,4,5],
        'YEAR':['1967-68','1968-69','1969-70','1970-71','1971-72'],
        'JUNE':['77.19','415.48','236.71','108.38','6.19'],
        'JULY':['76.19','435.48','26.71','138.38','9.19'],
        'AUGUST':['75.19','415.48','226.71','78.38','3.19']
        })

现在从这段代码中断言缺失月份的值为 0,并且上述代码的示例输出应该生成如下所示的 cvs 格式,

datetime;year;month;day;data 
1967-01-01 00:00:00;1967;1;1;0.0
1967-02-01 00:00:00;1967;2;1;0.0 
1967-03-01 00:00:00;1967;3;1;0.0
(contd. )
........
........ 
1967-06-01 00:00:00;1967;6;1;77.19
1967-07-01 00:00:00;1967;7;1;76.19
(contd. )
......... 
1968-06-01 00:00:00;1968;6;1;415.48
1968-07-01 00:00:00;1968;7;1;435.48
......... 
1972-12-01 00:00:00;1972;12;1;0.0

【问题讨论】:

  • 请阅读how to make good reproducible pandas examples并相应地编辑您的帖子。
  • @MaxU,现在可以了吗?
  • 是的,现在看起来好多了。您是否还可以根据该示例输入数据集发布您想要的数据集 - 对于输出/结果数据集,格式并不重要 - 它也可以是图片......
  • @MaxU,你现在能解决吗?
  • 现在我很困惑。你是如何在第一行获得价值0.0 的? 1968 年从何而来? 'S.No.' 列应该怎么办?您能否将输入数据集减少到 2-3 行并发布完整的输出数据集。目前还不是很清楚

标签: python python-3.x python-2.7 pandas datetime


【解决方案1】:

经过大量实践,我找到了解决此问题的方法, 这是我的代码,

# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import datetime

def month_string_to_number(string):
    m = {
        'jan':1,
        'feb':2,
        'mar':3,
        'apr':4,
        'may':5,
        'jun':6,
        'jul':7,
        'aug':8,
        'sep':9,
        'oct':10,
        'nov':11,
        'dec':12
        }
    s = string.strip()[:3].lower()
    try:
        out = m[s]
        return out
    except:
        raise ValueError('Not a month')

def years_conv(years):
    new_year=[]
    for year in years:
        prefix = year[:2]
        postfix =year[2:]
        pcs    = postfix.split('-')
        year1= prefix + pcs[0]
        new_year.append(year1)
#        year2= prefix + pcs[1]
#        new_year.append(year2)
    return new_year  


def year_conv(year):
    prefix = year[:2]
    postfix =year[2:]
    pcs    = postfix.split('-')
    year1= prefix + pcs[0]
    return year1

def timeseries(data, months):
    newdate=[]
    newdata=[]
    newyear=[]
    for idx1, rfrows in data.iterrows():
        year = year_conv(rfrows['YEAR'])
        for month in months:
            d ='1'
            mnt =month_string_to_number(month)
            newdate.append("-".join((year,str(mnt),d))) 
            newdata.append(rfrows[month]) 
            newyear.append(year) 

    dfdata = {'Data': newdata,'Datetime': newdate,'Year':newyear}        
    df = pd.DataFrame(dfdata)  
    df['Data'] = df['Data'].fillna(0)
    df = df[['Datetime','Year','Data']]    
    df['Datetime'] = pd.DatetimeIndex(df['Datetime']).floor('d')
#    df.set_index('Datetime', inplace=True)
    df.index =df['Datetime']


    df.index = df.index.to_period('m')
    idx = pd.date_range('1967-01-01','2011-01-01',freq='M').to_period('m')    

    #reindex and add NaN
    o_d = df.reindex(idx,fill_value=0)
    #filling missing date    
    #change periodindex to datetimeindex
    o_d['Datetime'] = o_d.index.to_timestamp()
    year_month =o_d['Datetime']
    o_d['Year'], o_d['Month'],o_d['Day'] = o_d['Datetime'].dt.year, o_d['Datetime'].dt.month,o_d['Datetime'].dt.day
    o_d['Datetime'] = pd.DatetimeIndex(year_month).floor('d')
    o_d = o_d[['Datetime','Year','Month','Day','Data']] 
    return o_d

def combine_stations_Data(sd):
    data=sd['lat']+sd['laval']+sd['lon']+sd['lovol']
    return data 


rainfall_data = pd.DataFrame({
        'S.No.':[1,2,3,4,5],
        'YEAR':['1967-68','1968-69','1969-70','1970-71','1971-72'],
        'JUNE':['77.19','25.0','236.71','108.38','6.19'],
        'JULY':['76.19','435.48','26.71','138.38','9.19'],
        'AUGUST':['75.19','415.48','226.71','78.38','3.19']
        })
#years = rainfall_data['YEAR'].tolist()
#rainfall_data.set_index('YEAR', inplace = 'True')
#months = rainfall_data[['JUNE', 'JULY', 'AUGUST']].mean(axis = 1).tolist()
months = ['JUNE', 'JULY', 'AUGUST']

new_rainfall_data = timeseries(rainfall_data,months)  

new_rainfall_data.to_csv('./StationsData/test.csv', index=False ,sep=';') 

【讨论】:

    【解决方案2】:

    虽然我不是 Python 开发人员,但我倾向于在逻辑方面为您提供帮助。猜猜这会对你有所帮助。

    $yrs = ['1967-68','1968-69','1969-70','1970-71','1971-72'];
    $new_yrs = [];
    foreach ($yrs as $yr) {
        // get first two character of string
        $prefix = substr($yr, 0,2);
        // remove first two character of string
        $postfix = substr($yr, 2);
        // break the string to 2 pcs
        $pcs = explode('-', $postfix);
        // get unique dates
        $new_yrs[$prefix.$pcs[0]] = $prefix.$pcs[0];
        $new_yrs[$prefix.$pcs[1]] = $prefix.$pcs[1];
    }
    

    输出: [1967 => "1967", 1968 => "1968", 1969 => "1969", 1970 => "1970", 1971 => "1971", 1972 => "1972"]

    【讨论】:

    • 它复制了兄弟的年份,例如。 1968,1968
    • 你错了兄弟,这不是重复的年份。一个在数组索引中,另一个是值。
    【解决方案3】:

    试试这个:

    df['Date'] = pd.to_datetime(df[['year','month','day']])
    

    来自pd.to_datetime() docs

    从 DataFrame 的多列中组装日期时间。按键 可以是常见的缩写,如 [‘year’, ‘month’, ‘day’, ‘minute’, ‘second’, ‘ms’, ‘us’, ‘ns’]) 或相同的复数形式

    【讨论】:

    • @vinodbhandary,您能否将一个小的可重现数据集发布为文本/CSV/Python 代码,以便我们复制和粘贴它?
    • 第一张图片取自 excel 文件,第二张图片应以 csv 格式输出。
    • @vinodbhandary,您是否希望我们从这些图片中手动输入您的数据集以帮助您? ;-)
    • 不,我不是这个意思,实际上我想将 excel 列转换为日期时间,以行给出年份,但月份只有列名..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多