The most pythonic way is to make sure any optional arguments have default values. So include all arguments that you know you need and assign them appropriate defaults.
def __init__(self, timestamp=None, data=[], metadata={}):
timestamp = time.now()
An important thing to remember is that any required arguments should not have defaults since you want an error to be raised if they're not included.
You can accept even more optional arguments using *args and **kwargs at the end of your arguments list.
def __init__(self, timestamp=None, data=[], metadata={}, *args, **kwards):
if 'something' in kwargs:
# do something