Extracting fundamental amplitude/phase from only half a period of a pseudo-sinusoïd
If you know the frequency (and it seems that you do), simply construct a basis set of vectors from 

1) DC (all ones)

2) Half a Sine wave

3) Half a Cosine wave

These form an orthogonal basis just like a DFT.  In fact you can think of it as a "one half bin and DC bin" specialized DFT.

Discard the DC reading (unless you care) and use the Sine and Cosine coefficients just like a regular DFT bin from which you can calculate magnitude (which gives you amplitude with a multiplication) and the phase (using atan2).

This will give you a best fit answer.  No window function and no zero padding.



Small correction (sorry):  The basis is not orthogonal.  You will need to solve a system of equations.

$$ x[n] = A \cos( \omega n ) + B \sin( \omega n ) + C $$

As a vector equation:

$$ \vec x = A \vec c + B \vec s + C \vec u $$

With some dot products, you get the system of equations with $A,B,C$ as the unknowns to be solved for.

$$ \vec x \cdot \vec c = A \vec c\cdot \vec c  + B \vec s\cdot \vec c  + C \vec u \cdot \vec c  $$

$$ \vec x \cdot \vec s = A \vec c\cdot \vec s  + B \vec s\cdot \vec s  + C \vec u \cdot \vec s  $$

$$ \vec x \cdot \vec u = A \vec c\cdot \vec u  + B \vec s\cdot \vec u  + C \vec u \cdot \vec u  $$

Note:

$$ \vec c \cdot \vec u = \vec u \cdot \vec c = 0 $$

$$ \vec c \cdot \vec s = \vec s \cdot \vec c = 0 $$

$$ \vec u \cdot \vec u = N $$

Where $N$ is your sample count.  Thus the equations simplify to:

$$ \vec x \cdot \vec c = A \vec c\cdot \vec c  $$

$$ \vec x \cdot \vec s = B \vec s\cdot \vec s  + C \vec u \cdot \vec s  $$

$$ \vec x \cdot \vec u = B \vec s\cdot \vec u  + C N $$



In order to get the best results with noisy data it is best to build the basis vectors over the full range of data you have and then solve the full set of equations.  A little more work, but likely worth it.  



Okay, for the OP and maybe Ben.  Here is a sample program for the best fit of a partial cycle.  In this case 0.6 of a cycle.


import numpy as np
import matplotlib.pyplot as plt

#==========================================================
def main():

#---- Set Parameters, Base Frequency and Phase

        f_s = 50.0
        p   = 60.0 * np.pi / 180.0

#---- Set Domain Time and Angle for partial cycle

        t = np.arange( 0.0, 1.0, 1.0 / f_s )
        a = 2.0 * np.pi * t * 0.6

#---- Construct the Signal

        x = 10.0 * np.cos(        a + p ) \
          +  0.2 * np.sin(  2.0 * a )     \
          +  0.2 * np.sin( 10.0 * a )

#---- Build Basis Vectors

        c = np.cos( a )
        s = np.sin( a )
        u = np.ones( a.shape )

#---- Do Basis Dot Products

        cc = c.dot( c )
        ss = s.dot( s )
        uu = u.dot( u )
        cs = c.dot( s )
        cu = c.dot( u )
        su = s.dot( u )

        print cs, ss, uu, cs, cu, su

#---- Do Signal Dot Products

        xc = x.dot( c )
        xs = x.dot( s )
        xu = x.dot( u )

        print xc, xs, xu

#---- Build Coefficient Matrix

        M = np.array( [[ cc, cs, cu ],  \
                       [ cs, ss, su ],  \
                       [ cu, su, uu ] ] )

        print M                       

#---- Build Values Matrix

        V = np.array( [xc, xs, xu] )

        print V

#---- Solve for the best fit "Bin Value"                       

        R = np.linalg.solve( M, V )

        print R

#---- Calculate the Best Fit parameters

        A = R[0]
        B = R[1]
        C = R[2]

        D   = np.sqrt( A*A + B*B )
        phi = np.arctan2( -B, A )

        print D, phi, p

#---- Construct the Best Fit signal

        y = D * np.cos( a + phi ) + C

#---- Show the Results

        plt.plot( t, x )
        plt.plot( t, y )

        plt.show()


#==========================================================
main()



And these are the results:



These are the values:


Underlying target:

    10.0
p =  1.0471975512

Found best fit:

D   = 10.1939671316 
phi =  1.04122684844 




Changing the parameters a little bit for a smaller portion (0.3) of the cycle and moving it up by 20.


        x = 10.0 * np.cos(        a + p ) \
          +  0.2 * np.sin(  2.0 * a )     \
          +  2.0 * np.sin( 10.0 * a )     \
          + 20.0


Results:



Notice this isn't as accurate because of the smaller cycle portion.


D   = 10.4409622651
phi =  0.943824736628


However, if the signal is a pure tone:


        x = 10.0 * np.cos( a + p ) + 20.0


The results are still exact on less than a third of the cycle:


D   = 10.0 
phi =  1.0471975512