You can get the Ether balance of a smart contract at any block using the Web3 JSON RPC which is exposed through Web3 libraries like Web3.js:
web3.eth.getBalance(address [, defaultBlock] [, callback])
As you can see, this function call supports a "block" input, which can be used to get the Ether balance of the specified address at a certain block.
Blocks are not created at perfect intervals, but you should be able to approximate the block you need by assuming the average block time is ~15 seconds.
You can then confirm you have the right block by getting the
timestamp value from the block (
web3.eth.getBlock()) and adjusting when needed.
To get the transaction count for the contract is more complicated because incoming transactions to a contract are not indexed by the network.
My suggestions would be to track the transactions which emit an Event.
You can get all the past events for a contract using:
myContract.getPastEvents(event[, options][, callback])
From that, you should get a pretty good idea of the activity of the smart contract over time. Especially if the contract is an ERC20 token, which must emit a
Transfer event whenever tokens are transferred and should emit the same event when tokens are created.
However, to truly get all internal and external transactions, you would need to go through each block since the contract was created, and look for those transactions (as far as I know). This is what Etherscan does, and is not a trivial task.