Pandas: How to create a datetime object from Week and Year?

后端 未结 4 1481
慢半拍i
慢半拍i 2020-12-01 14:22

I have a dataframe that provides two integer columns with the Year and Week of the year:

import pandas as pd
import numpy as np
L1 = [43,44,51,2,5,12]
L2 = [         


        
4条回答
  •  一个人的身影
    2020-12-01 15:12

    If you want to follow ISO Week Date

    Weeks start with Monday. Each week's year is the Gregorian year in which the Thursday falls. The first week of the year, hence, always contains 4 January. ISO week year numbering therefore slightly deviates from the Gregorian for some days close to 1 January.

    The following sample code, generates a sequence of 60 Dates, starting from 18Dec2016 Sun and adds the appropriate columns.

    It adds:

    • A "Date"
    • Week Day of the "Date"
    • Finds the Week Starting Monday of that "Date"
    • Finds the Year of the Week Starting Monday of that "Date"
    • Adds a Week Number (ISO)
    • Gets the Starting Monday Date, from Year and Week Number

    Sample Code Below:

    # Generate Some Dates
    dft1 = pd.DataFrame(pd.date_range('2016-12-18', freq='D', periods=60))
    dft1.columns = ['e_FullDate']
    dft1['e_FullDateWeekDay'] = dft1.e_FullDate.dt.day_name().str.slice(0,3)
    
    
    #Add a Week Start Date (Monday)
    dft1['e_week_start'] = dft1['e_FullDate'] - pd.to_timedelta(dft1['e_FullDate'].dt.weekday,
                                                          unit='D')
    dft1['e_week_startWeekDay'] = dft1.e_week_start.dt.day_name().str.slice(0,3)
    
    #Add a Week Start Year
    dft1['e_week_start_yr'] = dft1.e_week_start.dt.year
    
    #Add a Week Number of Week Start Monday
    dft1['e_week_no'] = dft1['e_week_start'].dt.week
    
    #Add a Week Start generate from Week Number and Year
    dft1['e_week_start_from_week_no'] = pd.to_datetime(dft1.e_week_no.astype(str)+
                      dft1.e_week_start_yr.astype(str).add('-1') ,format='%W%Y-%w')
    dft1['e_week_start_from_week_noWeekDay'] = dft1.e_week_start_from_week_no.dt.day_name().str.slice(0,3)
    
    
    with pd.option_context('display.max_rows', 999, 'display.max_columns', 0, 'display.max_colwidth', 9999):
        display(dft1)
    

提交回复
热议问题